Java 在Android应用程序中关闭ByteArrayOutputStream
在Android应用程序中,我正在发送一张从Java 在Android应用程序中关闭ByteArrayOutputStream,java,android,bytearrayoutputstream,Java,Android,Bytearrayoutputstream,在Android应用程序中,我正在发送一张从相机拍摄的照片,因此我需要将位图转换为字节数组。为此,我使用一个ByteArrayOutputStream,如下所示: private byte[] getRawImageData(Bitmap source) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] rawImageData = null; try { source.c
相机拍摄的照片,因此我需要将位图
转换为字节数组。为此,我使用一个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
文档的差异
上面写着
关闭ByteArrayOutputStream无效
草案内容如下:
关闭此流。这将释放用于此流的系统资源
我正在关闭流,不管是什么,但我想知道哪些文档是正确的,以及它们为什么不同。这是ByteArrayOutputStrem.close的实现
public void close() throws IOException {
}
API说关闭ByteArrayOutputStream没有效果
因此,省略close()是安全的,另一方面,它不会造成伤害,JVM无论如何都会跳过对空方法的调用。它可以用来避免警告资源未关闭。关闭流不会造成任何伤害,但不关闭流可能会造成伤害。
因此最好将其关闭。ByteArrayOutputStream
是一个基于内存的流(由代码中的用户管理和填充),因此对其调用close()
时没有效果。清除其内存足迹的唯一方法是取消对该对象的所有引用。到那时,垃圾收集器将在不久的将来随时启动,并完成清理此类对象的工作
但是,当您使用文件或输入/输出套接字流(例如,OutputStream
,InputStream
)等资源时,需要关闭流。在这样的流上调用close()
时,JVM会安全地释放其本地存储/占用的内存,并避免任何OutOfMemory问题
因此,一般来说,在不再需要时对任何类型的流调用close()
都是好的(有时是至关重要的),但更重要的是,最好知道我们为什么要调用它。第一个和第二个是正确的,取决于outputstrem实现,关闭一个bao,什么都不做。但是,始终关闭流是一种很好的做法,无论它们来自何处您是否担心字节数组下面的流会发生什么情况,当调用close
时?@epoch但问题是:当流什么都不做时,为什么需要关闭它?@Perception我不认为底层字节数组发生了什么是问题,因为流对象一旦超出范围就会被GCed。@bvidal-那么你的问题就是好奇?在任何情况下,第一份文件都是正确的,在BAS上的关闭操作是不可操作的。正如前面所述,您目前正在做的,您应该关闭它。