【发布时间】:2016-12-06 06:03:21
【问题描述】:
我需要从 700MB 的文件中读取几个字节(比如 1 MB、2 MB...)。
我尝试了几种方法,但我都得到了:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
我尝试使用 JDK 8 流:
try (Stream<String> lines = Files.lines(Paths.get("myfilename"),
Charset.defaultCharset())) {
lines.forEachOrdered(line -> doSomething(line));
}
并且还使用InputStream / OutputStream:
InputStream is = new FileInputStream("myfilename");
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) != -1) {
result.write(buffer, 0, length);
}
is.close();
return result.toString("UTF-8");
我有什么遗漏吗? 谢谢!
是的,它是二进制文件。所以这就是问题所在……我怎样才能读到其中的一部分?
【问题讨论】:
-
这有点奇怪。而且您确定没有其他代码没有显示给我们尝试一次打开整个文件?最坏的情况:尝试使用分析器来了解您的内存将去向......
-
你到底想达到什么目的?在这里你会得到一个 OOME,因为你显然将整个文件加载到了不适合分配给你 JVM 的内存的内存中
-
您是否有机会读取二进制文件?延迟流式传输的
Files.lines ()只能用于文本文件,因为行尾由特定于平台的行分隔符确定。如果您尝试以这种方式加载二进制文件,它可能会读取直到第一个行尾序列的所有字节,如果它存在的话(前提是不发生字符集转换错误)。因此,它可能会在第一行抛出 OoME。 -
您的第二个示例不起作用,因为您将文件保存到 ByteArrayOutputStream 并且您没有足够的内存。如果你使用文件输出流,你的第二个例子肯定会工作
-
我编辑了这个问题。是的,是二进制文件
标签: java text binary out-of-memory heap-memory