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

时间:2012-11-05 17:52:21

标签: 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;
}

2 个答案:

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

答案 1 :(得分:0)

这可能是Base64InputStream工作方式中的一个“功能”,即使您指定要读取的长度,如果您关闭它,它会关闭它,显然您打算不读取整个流

你可以将binaryStream包装在一个忽略关闭的InputStream中,或者你可以像你一样抑制警告。