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

最佳答案

我认为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);
    }

关于java - FindBugs-使用ObjectOutputStream时的 "may fail to close stream",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14434323/

10-11 00:02