我有这段代码,即将Ojbect写入字节数组流:
static byte[] toBytes(MyTokens tokens) throws IOException {
ByteArrayOutputStream out = null;
ObjectOutput s = null;
try {
out = new ByteArrayOutputStream();
try {
s = new ObjectOutputStream(out);
s.writeObject(tokens);
} finally {
try {
s.close();
} catch (Exception e) {
throw new CSBRuntimeException(e);
}
}
} catch (Exception e) {
throw new CSBRuntimeException(e);
} finally {
IOUtils.closeQuietly(out);
}
return out.toByteArray();
}
然而,FindBugs一直抱怨说:
s = new ObjectOutputStream(out);
“可能无法关闭流” - BAD_PRACTICE - OS_OPEN_STREAM。有人可以帮忙吗?
答案 0 :(得分:8)
我认为FindBugs并不认为IOUtils.closeQuietly(out)会关闭。
无论如何,关闭ObjectOutputStream就足够了,它将关闭底层的ByteArrayOutputStream。这是ObjectOutputStream.close实现
public void close() throws IOException {
flush();
clear();
bout.close();
}
因此您可以简化代码
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream s = new ObjectOutputStream(out);
try {
s.writeObject(1);
} finally {
IOUtils.closeQuietly(s);
}
或者如果您使用的是Java 7
ByteArrayOutputStream out = new ByteArrayOutputStream();
try (ObjectOutputStream s = new ObjectOutputStream(out)) {
s.writeObject(1);
}
答案 1 :(得分:1)
这意味着s.close()
将尝试关闭基础流,但可能无法执行此操作。所以要确保你也应该自己关闭它。尝试添加out.close()
并查看警告是否消失。