我有一個包含2000萬行文字的大文本文件。當我使用下面的程序讀取文件時,它工作得很好,事實上,我可以讀取更大的文件而不會出現內存問題。我的Java程序讀取大文本文件內存不足,任何人都可以解釋爲什麼嗎?
public static void main(String[] args) throws IOException {
File tempFile = new File("temp.dat");
String tempLine = null;
BufferedReader br = null;
int lineCount = 0;
try {
br = new BufferedReader(new FileReader(tempFile));
while ((tempLine = br.readLine()) != null) {
lineCount += 1;
}
} catch (Exception e) {
System.out.println("br error: " +e.getMessage());
} finally {
br.close();
System.out.println(lineCount + " lines read from file");
}
}
但是,如果我需要閱讀它之前,一些記錄到這個文件追加的BufferedReader中消耗了大量的內存(我剛使用Windows任務管理器來監視這個,不是很科學,但我知道它演示了這個問題)。修改後的程序如下,與第一個相同,除了我先將單個記錄追加到文件中。
public static void main(String[] args) throws IOException {
File tempFile = new File("temp.dat");
PrintWriter pw = null;
try {
pw = new PrintWriter(new BufferedWriter(new FileWriter(tempFile, true)));
pw.println(" ");
} catch (Exception e) {
System.out.println("pw error: " + e.getMessage());
} finally {
pw.close();
}
String tempLine = null;
BufferedReader br = null;
int lineCount = 0;
try {
br = new BufferedReader(new FileReader(tempFile));
while ((tempLine = br.readLine()) != null) {
lineCount += 1;
}
} catch (Exception e) {
System.out.println("br error: " +e.getMessage());
} finally {
br.close();
System.out.println(lineCount + " lines read from file");
}
}
Windows任務管理器,在當前行的大的凸起顯示了內存消耗,當我運行該程序的第二個版本的屏幕截圖。
所以我能夠讀取該文件,但不運行內存不足。但是我擁有超過5000萬條記錄的更大文件,當我對他們運行該程序時遇到內存不足異常?有人可以解釋爲什麼程序的第一個版本適用於任何大小的文件,但第二個程序的行爲如此不同並以失敗告終?我在Windows 7上運行有:
Java版本 「1.7.0_05」
的Java(TM)SE運行時環境(建立1.7.0_05-B05)
的HotSpot的Java(TM)客戶端虛擬機(建設23.1-B03 ,混合模式,共享)
這是不是'BufferedReader'這需要所有的記憶一些很好的分析運行的虛擬機獲得按堆轉儲?我寧願懷疑它會是這樣做的'FileWriter'。 –
是否有將BufferedWriter添加到組合中的理由?如果你使用'新的PrintWriter(new FileWriter(...))',你還會遇到同樣的問題嗎? –
(與問題無關,但我必須指出你可以在finally塊中得到一個NPE。處理這個問題的方法是使用Java SE 7的try-with-resource或Java SE 6使用單獨嘗試的最後和捕捉,並避免使用空值。) –