读取输入流到缓冲区的最佳方法

时间:2013-01-18 05:32:55

标签: java file-io io

要将任何输入流读取到缓冲区,有两种方法。有人可以帮我理解哪种方法更好,为什么?在哪种情况下我们应该使用每种方法?

  • 逐行阅读并将其附加到缓冲区。

例如:

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();
}

  • 读取缓冲区大小,即char数组中的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 个答案:

答案 0 :(得分: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 :(得分:0)

取决于目的。

使用文本文件读取行(如果需要)。

使用原始二进制数据时,请使用大块字节。

在您的示例中,字节块更健壮。 如果一条线太长并且破坏了一些中间物体会怎么样?

如果你的文件是二进制文件,你知道一行会有多大吗? 可能是文件的大小。

尝试“吞下”太大的字符串可能会导致ErrorOutOfMemory。 用1024字节(好吧 - 几乎)永远不会发生。

按1024字节分块可能需要更长时间,但更可靠。

答案 2 :(得分: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():"";
}

从String可以转换为字节数组或任何你想要的缓冲区。