【问题标题】:Java reading file to a byte array - most efficient implementationJava将文件读取到字节数组 - 最有效的实现
【发布时间】:2011-10-01 05:24:25
【问题描述】:

我正在从 Android 设备的 SD 卡中读取图像文件。由于内存泄漏,这会导致内存不足致命错误。我已将其范围缩小到 GC 未删除的 1 字节数组的分配。我使用 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);
     }        

【问题讨论】:

  • 每张图片有多大? getHexFileString() 的返回值是否缓存在任何地方?
  • 另外,为什么你需要代表图像的字节的十六进制值?
  • 长长的问题列表中的另一个问题 :-) 如果不调用函数 byteArrayToHexString() 是否会出现内存不足?

标签: java file memory filestream memory-leaks


【解决方案1】:

如果您在阅读时发生异常,您将不会关闭文件。最后还是用block比较好

【讨论】:

  • ++ 到那个。那也可能是您失去一些资源的地方。打开流(输入或输出)时,请确保您有一个 finally 块并始终在该块中关闭。然后你就放心它会被关闭。
【解决方案2】:

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

如果你想提高效率并避免内存不足,你应该使用返回一个字节[]的方法,然后对这个数组进行操作。

【讨论】:

  • 抱歉耽搁了。图像范围从 500 kb 到 1.5mb,当我将图像发送到服务器时,我需要字节的十六进制值。我的加密对十六进制值起作用。我没有尝试排除对 byteArrayToHexString() 的调用,但我相信这是发生内存泄漏。彼得——你能详细说明一下使用另一种方法吗?谢谢
  • 为了减少内存,您可以逐步读取和编码数据。无论文件大小如何,这都会将您的消耗量减少到几 KB。要发生内存泄漏,您必须持有对内存的引用,而您没有。
  • 问题是在对数据进行编码之前,我有很多步骤要对数据执行。我需要在编码之前存储一个十六进制值。当我运行应用程序时,它会检索一组图像文件并一个接一个地发送它们。我每次都会在内存不足之前发送一定数量的图像。这让我相信我没有从堆中删除使用过的内存。我已将其范围缩小到 byteArrayToHexString() 方法,但我看不到内存泄漏。
  • 如果有内存泄漏,不在此方法中。可能是此处创建的字符串被保留在其他地方。
猜你喜欢
  • 2013-01-13
  • 1970-01-01
  • 2020-03-09
  • 2021-10-16
  • 2023-03-08
  • 2013-07-31
  • 2023-03-05
  • 1970-01-01
  • 2011-10-15
相关资源
最近更新 更多