我有一个接受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;
}
答案 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中,或者你可以像你一样抑制警告。