Java чтение файла в байтовый массив - наиболее эффективная реализация - PullRequest
1 голос
/ 08 июля 2011

Я читаю файлы изображений с SD-карты устройства Android.Это приводит к фатальной ошибке нехватки памяти из-за утечки памяти.Я сузил его до выделения 1-байтовых массивов, которые не удаляются GC.Я использую FileInputStream для чтения в файле. Есть ли более эффективный способ сделать это?Вы видите причину утечки памяти?Спасибо

    private String getHexFileString(File _file)
    {
        byte[] byteStream = new byte[(int) _file.length()];
        String fileHexString = null;
        try
        {
            FileInputStream fis = new FileInputStream(_file);
            fis.read(byteStream);
            fis.close();
            fis = null;
            fileHexString = byteArrayToHexString(byteStream);
        }
        catch (FileNotFoundException e1) 
        {   actLog.addMessage(new ErrorMessage(e1));    }
        catch (IOException e2) 
        {   actLog.addMessage(new ErrorMessage(e2));    }
        catch(OutOfMemoryError e3)
        {   actLog.addMessage(new ErrorMessage(e3));    }


        return fileHexString;
    }

/**
 * This method formats a byte-array into a hex string
 * 
 * @param b byte-array
 * @return hex string
 */
     public String byteArrayToHexString(byte[] b) 
     {
        char[] hexVal = new char[b.length * 2];
        int value = 0;
        for (int i = 0; i < b.length; i++) 
        {
             value = (b[i] + 256) % 256;
             hexVal[i * 2 + 0] = kDigits[value >> 4];
             hexVal[i * 2 + 1] = kDigits[value & 0x0f];
        }
        return new String(hexVal);
     }        

Ответы [ 2 ]

2 голосов
/ 08 июля 2011

Вы, вероятно, обнаружите, что преобразование в шестнадцатеричную строку намного дороже по времени и памяти, чем чтение файла.то есть строка будет в 4 раза больше.

Если вы хотите повысить эффективность и избежать нехватки памяти, вам следует использовать метод, который возвращает байт [], и вы работаете с этим массивом.

2 голосов
/ 08 июля 2011

Если во время чтения произойдет какое-либо исключение, вы не закроете файл.Лучше наконец использовать блок

...