1

我正在尝试将整个文件作为字符串对象加载到内存中。但是在应用程序结束后,我的内存没有被释放回垃圾收集器。我知道读取内存中的整个文件是不好的,但我必须发送数据到另一个类,任何人都可以帮助我如何将其作为一个流而不是将整个代码加载到内存中,如果没有,任何人都可以说我现在的代码有什么问题

private   String processFile(FileItemStream item) throws IOException{

        InputStream is=null;

        try{
            is=item.openStream();
            return IOUtils.toString(is, "UTF-8");
        }
        finally {

            IOUtils.closeQuietly(is);

        }

    }




data=processFile(item)//method call
SomeClass(data);//passing the data string to this class
4

3 回答 3

1

您应该将您的传递给is需要数据的类。只要你不is一次读入所有的内容,你就不会用完所有的内存。将您的代码更改为:

InputStream is = null;
try {
    is = getFileAsStream(item);
    SomeClass(is)  //of course this probably doesn't compile, I'm just using your code sample
} finally {
    //close is
}
于 2013-07-01T18:26:27.480 回答
1

这取决于您可以使用的 API。如果他们的 API 允许您一次处理一个字节数组数据,那么您应该将一个块读入缓冲区并将其发送到该应用程序。如果它允许您传入 InputStream,那么您应该这样做。

如果 API 不允许您执行上述任一操作,那么您唯一能做的就是增加 Java 可以使用的内存量。为此,请使用 -Xmx512m 开关启动 Java,其中 512 是您可以分配给 Java 的内存量。

于 2013-07-01T18:30:15.120 回答
0

如果您确实无法更改您调用的 API 以获取字符串以外的内容,那么您将需要通过为您的 JVM 提供更多内存来解决该问题。这可以通过向 JVM 发送参数来更改。

-Xmx<size>

例如,您可以使用这样的设置为您的 JVM 提供 2GB 的最大堆

-Xmx2g

尽管如果您使用的 API 接受 String 作为参数并尝试传递数 GB 的字符串,那么您几乎可以肯定是错误地使用了他们的 API。如果有人构建了一个需要大量数据的 API,他们不会使用单个字符串作为参数来构建它。祝你好运。

于 2013-07-01T18:41:39.720 回答