6

我有一个接受InputStream(二进制数据)并将其序列化为 XML 的方法。为此,它使用 base64 编码器和 a 包装流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;
}
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工作方式中的一个“功能” ,即使您指定要读取的长度,如果您在显然不打算读取整个流时关闭它,它也会关闭底层流。

您可以将 binaryStream 包装在忽略关闭的 InputStream 中,或者您可以抑制警告。

于 2012-11-05T18:06:37.627 回答