我的应用程序中有这个代码片段,我很确定我有 关闭了所有的溪流。
但令人惊讶的是,我一直在: 资源是在附加的堆栈跟踪中获取的,但从未发布过。有关避免资源泄漏的信息,请参阅java.io.Closeable。 java.lang.Throwable:显式终止方法'close'未调用
任何指针都非常有用。
if (fd != null) {
InputStream fileStream = new FileInputStream(fd.getFileDescriptor());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
try {
for (int readNum; (readNum = fileStream.read(buf)) != -1;) {
bos.write(buf, 0, readNum);
}
content = bos.toByteArray();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
if (fileStream != null) {
fileStream.close();
}
if (bos != null) {
bos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:1)
尝试将流的实例化移动到try
InputStream fileStream = null;
ByteArrayOutputStream bos = null;
byte[] buf = new byte[1024];
try {
fileStream = new FileInputStream(fd.getFileDescriptor());
bos = new ByteArrayOutputStream();
答案 1 :(得分:1)
尝试使用try with resources。这消除了关闭finally块中的资源的需要。 https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
if (fd != null) {
byte[] buf = new byte[1024];
try (InputStream fileStream = new FileInputStream(fd.getFileDescriptor());
ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
for (int readNum; (readNum = fileStream.read(buf)) != -1;) {
bos.write(buf, 0, readNum);
}
content = bos.toByteArray();
} catch (IOException ex) {
ex.printStackTrace();
}
}
答案 2 :(得分:1)
使用try with resources可以解决问题。 https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html。您可以在这里查看已在Java 7 http://docs.oracle.com/javase/7/docs/api/java/lang/AutoCloseable.html
中引入的AutoCloseable接口答案 3 :(得分:0)
我看到的是,如果在关闭fileStream时发生异常,bos将无法关闭。
如前所述:使用try-with-resources声明: https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html