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)
如果您是一名快乐的 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)