2

次のコードは、File のごく一部のみを StringBuilder に書き込むように見えます - なぜですか?

    Reader rdr = new BufferedReader(new InputStreamReader(new FileInputStream(...)));
    StringBuilder buf = new StringBuilder();
    CharBuffer cbuff = CharBuffer.allocate(1024);
    while(rdr.read(cbuff) != -1){
        buf.append(cbuff);
        cbuff.clear();
    }
    rdr.close();

いくつかの詳細情報: ファイルは CharBuffer よりも大きいです。また、デバッガーから、charbuffer が実際に期待どおりに満たされていることがわかります。StringBuilder に到達する唯一の部分は、ファイルの途中のどこかにあるようです。私はopenJDK7を使用しています。なぜそのような動作を示すのか、どうすれば修正できるのだろうか。

4

2 に答える 2

7

cbuff.flip()Peter Lawrey が述べたように、読み取りと書き込みの間で呼び出す必要があります。append は、を呼び出さない場合は最後にあるバッファの位置から読み取るようcbuff.flip()です。中間のどこかからの部分がまだ書き込まれている理由は、最終的にバッファーが完全に満たされないためです。そのため、バッファー内の位置とバッファーの末尾の間に「古い」バイトがまだ残っています。

謎が解けました:-)

于 2012-10-31T09:49:12.770 に答える
1

これらのクラスはすべて、1.0 以降 JDK の一部です。それらのいずれかを修正する必要があるとは思えません。

あなたのコードは、通常の慣用句にはほど遠いものです。これは学習演習として意図されたもので、失敗に終わりましたか? それとも、本当にこれをアプリケーションに入れたかったのですか?

これらのクラスが使用されることを期待する方法は次のとおりです。

public static final String NEWLINE = System.getProperty("line.separator");

public String readContents(File f) throws IOException {
    StringBuilder builder = new StringBuilder(1024);
    BufferedReader br = null;
    try {
        br = new BufferedReader(new FileReader(f));
        String line;
        while ((line = br.readLine()) != null) {
            builder.append(line).append(NEWLINE);
        }
    } finally { 
        closeQuietly(br);
    }
    return builder.toString();
}
于 2012-10-31T09:17:22.360 に答える