2013-03-28 79 views
2

在JAVA我想讀.log文件的全部內容,其具有1MB大小的最大文本文件的全部內容,我需要將其存儲在StringBuilder的想讀爲1MB大小的最大

我試過使用這段代碼,但給了異常STACKERRORFLOW。

  String fileName = "C://test//.log"; 
    File testfile = new File(fileName); 
    int ch; 
    StringBuilder strcontent = new StringBuilder(); 
    try 
    { 
     FileInputStream fis = new FileInputStream(testfile); 
     while((ch = fis.read()) != -1) 
      strcontent.append((char)ch); 
     fis.close();   
    } 
      System.out.println(strcontent.toString()); 

會是什麼問題。

+5

您的代碼似乎不完整。你的catch塊在哪裏? – shazin 2013-03-28 10:42:27

+2

在哪一行是拋出異常? – mthmulders 2013-03-28 10:45:17

+1

首先指定'StringBuilder'的預期內容大小,類似於'1024 * 1024',這將預先分配內部緩衝區,因此不需要在運行時調整大小。以字塊的形式讀取字節數組。你甚至可以使用'FileReader',這將允許你使用'char'數組 – MadProgrammer 2013-03-28 10:45:51

回答

2

如果你想讀的日誌文件,我建議你使用java.io.BufferedReader

BufferedReader r = null; 
File testfile = new File("C://test//.log"); 
StringBuilder b = new StringBuilder(); 
    try { 
     r = new BufferedReader(new FileReader(testfile)); 
     String line = null; 
     while ((line = r.readLine()) != null) { 
      b.append(line); 
     } 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
    finally { 
     try { 
      r.close() 
     } 
     catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

#1可能會導致作爲@MadProgrammer指出。

而且你正在閱讀更大的文件char char,這是我認爲無效。你知道多少次會調用append()方法嗎?

正如@joan指出的-Xmx JVM選項,我認爲這不會幫助,因爲這與堆大小問題有關,而不是stackoverflow。當你進行大的遞歸時,通常會拋出SO,或者如果某些事情被稱爲很多次,並且變量填滿了堆棧,通常會拋出它。

+0

然後,在'finally'塊中關閉'r'。 – 2013-03-28 10:49:59

+0

@EricJablow是的,我忘了,更新。 – Sajmon 2013-03-28 10:52:47

+0

ex.printStackTrace()。 – 2013-03-28 11:01:21

0

這裏的問題是最大的堆大小。

使用-Xmx JVM選項增加Java最大堆大小。希望這可以幫助。

+0

如果問題是堆大小問題不是一個'java.lang.OutOfMemoryError'而不是堆棧溢出? – 2013-03-28 10:51:36

+0

奧普斯,是的,你是對的。我讀得太快了。 – joan 2013-03-28 11:06:48

+0

謝謝你的回覆.. :)它幫了我很多。 :) – 2013-03-28 11:24:27