2016-08-01 71 views
0

我需要从700MB文件中读取几个字节(比如1 MB,2 MB ...)。试图从一个大的文本文件中读取一些字节java

我尝试了几种方法,但在他们每个人我得到:

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"); 

有什么我失踪? 谢谢!

是的,它是二进制文件。所以这就是问题......我如何阅读它的一部分?

+0

这就是有点奇怪。而且你确定没有其他代码围绕着,你没有向我们展示试图一次打开整个文件?最坏的情况:尝试使用探查器来了解你的记忆在哪里... – GhostCat

+3

你想要达到什么目的?在这里你得到一个OOME,因为你显然将整个文件加载到内存中,而这个内存不适合分配给你的JVM的内存。 –

+2

你有没有机会读取二进制文件?延迟的Files.lines()只能用于文本文件,因为一行的结尾由平台特定的行分隔符决定。如果试图以这种方式加载二进制文件,它可能会读取所有字节,直到第一个行尾序列,如果它存在的话(只要不发生字符集转换错误)。因此它可能会在第一行中抛出OoME。 – charlie

回答

0

在32位模式下使用JVM时,可以分配的最大堆大小为1280 MB。所以,如果你想超越这个范围,你需要在64模式下调用JVM。

尝试使用选项Java执行:

XMS =分钟内存分配

XMX =最大内存分配

JVM_ARGS="-d64 -Xms1024m -Xmx15360m " 
jdk1.X/bin/java $JVM_ARGS -jar myprogram.jar