8

我有这段代码,就是将 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。有人可以帮忙吗?

4

2 回答 2

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);
    }
于 2013-01-21T07:58:00.183 回答
1

这意味着s.close()它将尝试关闭底层流,但它可能无法做到这一点。所以要确保你也应该自己关闭它。尝试添加out.close()并查看警告是否消失。

于 2013-01-21T07:54:03.133 回答