我有这段代码:
private void save(Bitmap bitmap) {
try {
FileOutputStream fos = new FileOutputStream(path);
bitmap.compress(Bitmap.CompressFormat.JPEG, COMPRESSION_QUALITY, fos);
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
我是否需要关闭FileOutputStream
catch块中的FileNotFoundException
?
如果抛出该异常意味着无法打开文件,那么我认为没有必要。但是,我认为在IOException
catch块中这样做会很好。
如果我不这样做,是否会导致任何内存泄漏错误或类似内容?
感谢。
答案 0 :(得分:1)
如果您使用的是Java 7或更高版本,则应使用尝试使用资源并让系统决定。
private void save(Bitmap bitmap) {
try (FileOutputStream fos = new FileOutputStream(path)) {
bitmap.compress(Bitmap.CompressFormat.JPEG, COMPRESSION_QUALITY, fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
如果没有,那么只需确保该流不是null
,而是在finally
中进行。
private void save(Bitmap bitmap) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(path);
bitmap.compress(Bitmap.CompressFormat.JPEG, COMPRESSION_QUALITY, fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
fos.close();
}
}
}
答案 1 :(得分:1)
没有什么可以关闭的。 FileOutputStream
构造函数引发了异常;溪流从未建成;从未分配fos
变量;它超出了catch
块的范围。
答案 2 :(得分:0)
完成读取或写入后,应始终关闭文件。否则,您将保持资源繁忙,一般来说可能是个问题 如果以这种方式修改代码,则不必关心文件,java会考虑它。
private void save(Bitmap bitmap) {
try(FileOutputStream fos = new FileOutputStream(path)) {
bitmap.compress(Bitmap.CompressFormat.JPEG, COMPRESSION_QUALITY, fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}