在Android应用程序中,我正在发送从Camera Intent
拍摄的照片,因此我需要将Bitmap
转换为字节数组。为此,我使用ByteArrayOutputStream
如下:
private byte[] getRawImageData(Bitmap source) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] rawImageData = null;
try {
source.compress(CompressFormat.JPEG, DEFAULT_COMRESSION, baos);
rawImageData = baos.toByteArray();
} finally {
try {
baos.close();
} catch (IOException e) {
// handle exception here
}
}
return rawImageData;
}
一切都运行正常,真正的问题是javadoc与Android文档之间的ByteArrayOutputStream
文档的差异。
Javadoc读取
关闭ByteArrayOutputStream无效。
Android doc读取:
关闭此流。这将释放用于此流的系统资源。
我正在关闭流,不管怎么说,但我想知道哪些文档是正确的以及为什么它们不同。
答案 0 :(得分:9)
ByteArrayOutputStream
是基于内存的流(由用户在代码中管理和填充),因此当您在其上调用close()
时无效。清理其内存占用的唯一方法是撤消对该对象的所有引用。届时,垃圾收集器将在未来的任何时间启动并完成其工作以清理此类对象。
但是,当您使用文件或输入/输出套接字流等资源(例如OutputStream
,InputStream
)时,需要关闭流。当您在此类流上调用close()
时,JVM会安全地释放其本地存储/占用内存,并避免任何OutOfMemory问题。
因此,一般情况下,在不再需要任何类型的流时调用close()
是好的(有时是至关重要的),但更重要的是,最好知道我们为什么要调用它。
答案 1 :(得分:3)
这是ByteArrayOutputStrem.close
的实现public void close() throws IOException {
}
API说关闭ByteArrayOutputStream无效
所以省略close()是安全的,另一方面它没有坏处,JVM无论如何都会跳过对空方法的调用。它可用于避免警告资源未关闭。
答案 2 :(得分:0)
关闭流不会造成任何伤害,但不会关闭它。 所以最好关闭它。