6

InputStream(バイナリ データの)を受け取り、それを XML にシリアル化するメソッドがあります。そのために、ストリームを base64 エンコーダーでラップし、Reader文字データに変換します。ただし、InputStreamはパラメーターとして渡されるため、ストリームを閉じることは有害な副作用であると考えられますReader.close()。リーダーを閉じないと、コンパイラは、

リソース リーク: リーダーが閉じられることはありません

それで、@SuppressWarnings( "resource" )リーダー宣言に a を追加できますが、それは正しいことですか? 何か不足していますか?

実際のコードは次のとおりです。

/**
 * Writes base64 encoded text read from the binary stream.
 * 
 * @param binaryStream
 *            The binary stream to write from
 * @return <code>this</code> XmlWriter (for chaining)
 * @throws IOException
 */
public XmlWriter binary( InputStream binaryStream ) throws IOException {
    Reader reader = new InputStreamReader( 
            new Base64InputStream( binaryStream, true, base64LineLength, base64LineSeparator.getBytes( charset ) ) );
    int bufferSize = 2048;
    int charsRead;
    char[] buffer = new char[bufferSize];
    while ( (charsRead = reader.read( buffer, 0, bufferSize )) >= 0 ) {
        writer.write( buffer, 0, charsRead );
    }

    return this;
}
4

2 に答える 2

1

Java 7 に満足している場合は、次のことを試してください。

try(InputStream binaryStream = /* ... */) {
    xmlWriter.binary(binaryStream);
}

ストリームは閉鎖されています。Java 7 を使用できない場合は、ストリームに対するbinary()メソッドの責任ではないことに同意します。close()警告を無視して、ツールに設計を任せないでください。大丈夫だよ。

Reader最後の手段として、 を無視して軽量のラッパーを作成することもできますがclose()、プログラム フローをたどるのが難しくなるため、お勧めしません。

また、Apache Commons IOに次のことを手伝ってもらいましょうIOUtils.copy()

public XmlWriter binary( InputStream binaryStream ) throws IOException {
    Reader reader = new InputStreamReader( 
            new Base64InputStream( binaryStream, true, base64LineLength, base64LineSeparator.getBytes( charset ) ) );
    IOUtils.copy(reader, writer);
    return this;
}
于 2012-11-05T18:07:49.217 に答える
0

これはおそらく、Base64InputStreamが機能する方法の「機能」であり、読み取る長さを指定しても、ストリーム全体を読み取らないことを明確に意図しているときにストリームを閉じると、基になるストリームを閉じます。

クローズを無視する InputStream で binaryStream をラップするか、警告を抑制することができます。

于 2012-11-05T18:06:37.627 に答える