Java读取文件到字节数组 - 最有效的实现

时间:2011-07-08 11:48:44

标签: java file memory filestream memory-leaks

我正在读取Android设备的SD卡上的图像文件。这会导致内存泄漏导致内存不足致命错误。我已将其缩小为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 个答案:

答案 0 :(得分:2)

如果您在阅读时发生某些异常,则不会关闭该文件。最后使用块

会更好

答案 1 :(得分:2)

您可能会发现转换为十六进制字符串的时间和内存比读取文件要昂贵得多。即字符串将大4倍。

如果你想提高效率并避免内存不足,你应该使用一个返回byte []的方法来操作这个数组。