2016-08-01 72 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