2013-01-18 89 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

逐行读取可能很危险,因为如果开始逐行读取二进制文件,行的大小可能等于文件的大小。只有在处理文本文件时,行才有意义。 –