2010-03-12 98 views
3

我有一個InputStreamReader對象。我想通過一個函數調用將多行讀入緩衝區/數組(不包括大量的字符串對象)。有沒有簡單的方法來做到這一點?從InputStreamReader(JAVA)讀取多行

+0

是你想讀的固定或變化的行數? – Jason 2010-03-12 17:33:22

+0

固定,比如每行讀取100行 – amitlicht 2010-03-12 17:34:38

+0

行是固定長度的嗎? – 2010-03-12 17:44:55

回答

3

首先介意的是InputStreamReader效率不高,你應該圍繞BufferedReader對象包裝,以獲得最佳性能。

綜合考慮這一點,你可以做這樣的事情:

public String readLines(InputStreamReader in) 
{ 
    BufferedReader br = new BufferedReader(in); 
    // you should estimate buffer size 
    StringBuffer sb = new StringBuffer(5000); 

    try 
    { 
    int linesPerRead = 100; 
    for (int i = 0; i < linesPerRead; ++i) 
    { 
     sb.append(br.readLine()); 
     // placing newlines back because readLine() removes them 
     sb.append('\n'); 
    } 
    } 
    catch (Exception e) 
    { 
    e.printStackTrace(); 
    } 

    return sb.toString(); 
} 

記住,readLine()回報nullEOF達到,所以你應該檢查並照顧它。

+0

這個目標不是逐行讀取,因爲它用冗餘的字符串對象填充我的堆並使GC變得瘋狂。我想從inputstreamreader中讀取(使用bufferedReader/whatever),而不創建許多String對象。也許直接讀入一個緩衝區(不需要在中間創建一個字符串),或者讀取多行以避免字符串垃圾... – amitlicht 2010-03-12 18:03:21

+1

使用__RandomAccessFile__直接讀取字節緩衝區有什麼用處?整個文件(__readFull(byte [] b)__) – Jack 2010-03-12 18:42:23

+0

字符串在JVM v。1.6中非常優化。你是否使用過一個探查器並且真的發現了一個問題?或者你只是猜測? – incarnate 2010-03-12 21:29:52

0

如果你有多行分隔符,你可以使用長度和偏移量的read方法讀取很多字符。否則使用一個StringBuilder來追加BufferedReader讀取的每一行應該對你沒有太大的臨時內存