ByteArrayOutputStream或ByteArrayInputStream是内存读写流,不同于指向硬盘的流,它内部是使用字节数组读内存的,这个字节数组是它的成员变量,当这个数组不再使用变成垃圾的时候,Java的垃圾回收机制会将它回收。所以不需要关流。
如下图所示,ByteArrayOutputStream内部是数组:
//jdk 1.8
public class ByteArrayOutputStream extends OutputStream {
protected byte buf[]; //数组,在内存中存储
public void close() throws IOException { //close()方法实现为空
}
然后再看看FileOutputStream的构造:
class FileOutputStream extends OutputStream {
/* 文件描述符类---此处用于打开文件的句柄 */
private final FileDescriptor fd;
public FileOutputStream(File file, boolean append)
throws FileNotFoundException
{
String name = (file != null ? file.getPath() : null);
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkWrite(name);
}
if (name == null) {
throw new NullPointerException();
}
if (file.isInvalid()) {
throw new FileNotFoundException("Invalid file path");
}
this.fd = new FileDescriptor();
fd.attach(this);
this.append = append;
this.path = name;
open(name, append); //最终调用native open0
}
public void close() throws IOException { //close有具体实现代码
synchronized (closeLock) {
if (closed) {
return;
}
closed = true;
}
if (channel != null) {
channel.close();
}
fd.closeAll(new Closeable() {
public void close() throws IOException {
close0(); //调用native close0
}
});
}
FileOutputStream 调用native与磁盘交互,因此需要关闭连接