4

バッファへの入力ストリームを読み取るには、2つの方法があります。誰かが私にどちらがより良い方法で、なぜかを理解するのを手伝ってもらえますか?そして、どのような状況でそれぞれの方法を使用する必要がありますか?

  • 行ごとに読み取り、それをバッファに追加します。

例えば:

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) {
}
4

3 に答える 3

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();
}
于 2013-01-18T06:04:51.137 に答える
1

目的によります。

テキストファイルを操作するには、行を読み取ります (必要な場合)。

生のバイナリ データを扱うには、バイトのチャンクを使用します。

あなたの例では、バイトのチャンクがより堅牢です。行が長すぎて中間オブジェクトの一部が壊れている場合はどうなりますか?

ファイルがバイナリの場合、行がどれくらい大きくなるか知っていますか? ファイルのサイズかもしれません。

大きすぎる文字列を「飲み込もう」とすると、ErrorOutOfMemory が発生する場合があります。1024 バイトでは (OK - ほとんど) 起こりません。

1024 バイトごとにチャンクすると時間がかかる場合がありますが、より信頼性が高くなります。

于 2013-01-18T05:40:39.983 に答える
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():"";
}

文字列から、バイト配列または任意のバッファに変換できます。

于 2013-01-18T05:45:13.170 に答える