2012-04-22 68 views
0
read_data = new BufferedReader(new FileReader(args[0])); 
    data_buffer = new StringBuffer(); 

    int i; 

    while(read_data.ready()) 
    {   
     while((i = read_data.read()) != -1) 
     { 
      data_buffer.append((char)i); 
     }   
    } 

    data_buffer.append(System.getProperty("line.separator")); 

我想要做的是,將整個.txt文件讀入一個字符串並在字符串中添加一個換行符。然後可以通過傳遞data_buffer.toString()來創建一個新的掃描器來處理這個字符串。很明顯,在真正大的文件中,這個過程需要花費很多時間,我所要做的只是在我讀入內存的.txt文件中添加一個換行符。什麼是最快/最有效的方式來追加一個文件加載到內存中的文件?

我知道整個想法似乎有點怪異或怪異,但有沒有更快的方法?

乾杯:)

+0

嗯,至少,初始化StringBuffer到文件的長度(如果你能知道的話)或者至少是一個相當大的數字,以最小化重新分配操作。 – 2012-04-22 14:33:35

+0

謝謝。我發現這個鏈接也做得非常好,所以對於碰巧想知道我是同一件事的其他人:http://weblogs.java.net/blog/pat/archive/2004/10/stupid_scanner.html – Chrispy 2012-04-22 14:40:31

回答

3

做某事的最快方法通常是不要做。

爲什麼不修改解析代碼,使得最後的換行符不是必需的?如果您每次都追加它,那麼您可以更改代碼,使其表現得好像在那裏一樣,而實際上並不存在。

接下來我想嘗試的是避免通過char創建一個巨大的String char,因爲這確實是相當昂貴的。您可以基於InputStream創建Scanner,它可能比將數據讀入String並解析該數據要快得多。您可以覆蓋您的FileInputStream以在文件末尾返回虛擬換行符,從而避免粘貼字符串的安裝。

如果你絕對肯定必須將數據讀入緩衝區,那麼使用流的基於數組的read()讀入字節數組可能會更好 - 比字節快得多。由於您可以事先知道文件的大小,因此可以爲緩衝區分配足夠的空間用於額外的行尾標記,並將其插入到數組中。與創建一個StringBuffer並將其作爲String不同,這不需要緩衝區的完整副本。

1

如果您所做的只是將生成的文件傳遞給掃描儀,則應爲該文件創建一個可讀文件並將其發送給掃描儀。

下面是一個例子(未經測試):

public class NLReader implements Readable { 

    Reader r; 
    boolean atEndOfReader = false; 
    boolean atEnd = false; 

    public NLReader(Reader r) { 
     this.r = r; 
    } 

    public int read(CharBuffer cb) throws IOException { 
     if (!atEndOfReader) { 
      int result = r.read(cb); 
      if (result == -1) { 
       atEndOfReader = true; 
      } else { 
       return result; 
      } 
     } 
     if (!atEnd) { 
      String nl = System.getProperty("line.separator"); 
      cb.append(nl); 
      atEnd = true; 
      return nl.length(); 
     } 

     return -1; 
    } 
} 

這隻能讀取文件一次,並且從來沒有把它複製(不像你的StringBuffer - 相反,除非你真的需要的StringBuffer同步,你應該使用StringBuilder的)。

這也不會將實際的文件加載到內存中,這樣也可以節省內存壓力。

2

從我所知道的是,你在做什麼試圖做的是以這樣的方式讀取文件,使得它總是在最後一行的末尾顯示一個行分隔符。

如果是這種情況,那麼你可以通過實現FilterReader的子類來實現,並在需要時插入一個或多個額外字符,當它到達字符流的末尾時。

執行此操作的代碼不會變得無足輕重,但它將避免緩衝整個文件在內存中的時間和空間開銷。

相關問題