2013-01-18 161 views
3

對於讀取到緩衝區的任何輸入流,有兩種方法。有人能幫助我瞭解哪種方法更好,爲什麼?在哪種情況下,我們應該使用每種方法?將輸入流讀取到緩衝區的最佳方法

  • 逐行讀取並將其附加到緩衝區。

例如:

public String fileToBuffer(InputStream is, StringBuffer strBuffer) throws IOException{ 
    StringBuffer buffer = strBuffer; 
    InputStreamReader isr = null; 

    try { 
     isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 
     String line = null; 

     while ((line = br.readLine()) != null) { 
      buffer.append(line + "\n"); 
     } 
    } finally { 
     if (is != null) { 
      is.close(); 
     } 
     if (isr != null) { 
      isr.close(); 
     } 
    } 

    return buffer.toString(); 
} 

  • 讀高達緩衝區大小即1024個字節的字符數組。

如:

InputStreamReader isr = new InputStreamReader(is); 
final int bufferSize = 1024; 
char[] buffer = new char[bufferSize]; 
StringBuffer strBuffer = new StringBuffer(); 

/* read the base script into string buffer */ 
try { 
    while (true) { 
     int read = isr.read(buffer, 0, bufferSize); 
     if (read == -1) { 
      break; 
     } 

     strBuffer.append(buffer, 0, read); 
    } 
} catch (IOException e) { 
} 

回答

3

考慮

public String fileToBuffer(InputStream is, StringBuffer strBuffer) throws IOException { 
    StringBuilder sb = new StringBuilder(strBuffer); 
    try (BufferedReader rdr = new BufferedReader(new InputStreamReader(is))) { 
     for (int c; (c = rdr.read()) != -1;) { 
      sb.append((char) c); 

     } 
    } 
    return sb.toString(); 
} 
+1

+1顯示java 7的try子句:) – Sikorski

+0

想一想爲什麼? – EJP

+4

您提供了一個單字節緩衝區版本作爲*改進*? –

0

取決於目的。

用於處理文本文件讀取行(如果您需要)。

對於原始二進制數據使用塊大小的字節。

在你的例子中,字節塊更健壯。 如果一條線太長並且破壞了一些中間對象會怎麼樣?

如果你的文件是二進制的,你知道一條線有多大嗎? 可能是文件的大小。

試圖「吞下」太大的字符串可能會導致ErrorOutOfMemory。 它有1024字節(確定 - 幾乎)不會發生。

由1024字節塊化可能需要更長的時間,但它更可靠。

+0

他沒有字節的塊在他的榜樣。他有大量的字符。 – EJP

+0

謝謝,但它並沒有太大的改變。邏輯依然是一樣的。 –

0

使用'readLine'並不那麼整潔。提問者的方法2是很標準,但下面的方法是唯一的(可能更好):

//read the whole inputstream and put into a string 
public String inputstream2str(InputStream stream) { 
    Scanner s = new Scanner(stream).useDelimiter("\\A"); 
    return s.hasNext()? s.next():""; 
} 

從您可以轉換爲字節數組或任何緩衝區你想要的字符串。

+0

爲什麼逐行讀取危險? (不是我不同意,而是你應該說明你的理由。)因此,逐行閱讀和用新行分隔符掃描有什麼區別?答案:零。那麼爲什麼推薦它? – EJP

+0

好,夠公平的:| – jondinham

+0

逐行讀取可能很危險,因爲如果開始逐行讀取二進制文件,行的大小可能等於文件的大小。只有在處理文本文件時,行纔有意義。 –