是否可以在不关闭流的情况下关闭Reader?

Luc*_*cas 5 java inputstream resource-leak

我有一个接受InputStream(二进制数据)并将其序列化为XML的方法.为此,它使用base64编码器封装流,Reader并将其转换为字符数据.但是,由于InputStream作为一个参数传递,我认为关闭流是一个有害的副作用,而合同Reader.close()说它会这样做.如果我不关闭阅读器,编译器警告我,我有一个

资源泄漏:读者永远不会关闭

所以,我可以@SuppressWarnings( "resource" )在读者声明中添加一个,但这是正确的做法吗?我错过了什么吗?

这是实际的代码:

/**
 * 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;
}
Run Code Online (Sandbox Code Playgroud)

Tom*_*icz 1

如果您是一名快乐的 Java 7 用户,请尝试以下操作:

try(InputStream binaryStream = /* ... */) {
    xmlWriter.binary(binaryStream);
}
Run Code Online (Sandbox Code Playgroud)

并且流已为您关闭。如果你不能使用Java 7,我同意这不是binary()方法对流close()的责任。只需忽略警告,不要让工具驱动您的设计。没关系。

作为最后的手段,您可以编写一个轻量级Reader包装器 ignoring 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;
}
Run Code Online (Sandbox Code Playgroud)