关于IO流操作方面的几个疑问
1、处理流(过滤流)就是被Filter修饰的流类吗?如果不是,那处理流还包括什么?Filter不就包含了“过滤”的意思吗?(FilterInputStream、FilterOutputStream、FilterReadder、FilterWriter)2、所有输出流都具有内存缓冲区吗?(OutputStream、Writer结尾的类是否都先缓存在一个缓冲区,等到一定条件后一并输出?)
3、输入流也具有缓冲区吗?
4、是不是只有处理流才具有缓冲区?
5、所有输出流都具有flush()方法吗?在关闭流资源前是不是必须flush()一下才能让输出流的数据真正输出?
6、输入流也有缓冲区的话,是不是在读取数据时也必须先flush()一下才可以呢?
对IO一窍不通,望各位朋友能给予帮助,谢谢~~ --------------------编程问答-------------------- 是不是具有flush()方法的所有类都是用缓冲区呢? --------------------编程问答--------------------
建议楼主去看一下API和源码,讲的很详细。 --------------------编程问答-------------------- 直接看api吧
想要理解的最深,学的最好,就直接看api
官方的说法
祝楼主中秋节快乐 --------------------编程问答-------------------- 补上对楼主中秋的祝福 --------------------编程问答-------------------- 1.处理流(过滤流)就是被Filter修饰的流类吗?并不是这样的,过滤流还称装饰类,只是扩展了进一步处理数据的功能,它们的构造必须使用一个已经存在的输入流/输出流,并用它进行实际的读写。比如缓存流 BufferedInputStream/BufferedOutputStream,只有一个flush()起了作用;数据流 DataInputStream/DataOutputStream以Java 基本数据类型(8大类型)和 UTF (稍不同于标准的UTF) 的形式读写数据;以字符数组/字节数组的形式写字符串等;打印流 PrintStream,我们常用的System.out就是这种,自带flush()功能;还有其他过滤流。
2.查下API你会知道OutputStream、Writer类都有flush()功能,所以OutputStream、Writer结尾的类都有缓存功能。
3.输入流是没有缓存功能的,(没flush()方法)。
4.不是处理流才有缓存功能,是输出流才有缓存功能。
5.是的,所以每次close()前,都要flush();
6.输入流是没缓存功能的..........LZ中秋快乐!
--------------------编程问答--------------------
其实close()方法就包括了.flush()了 --------------------编程问答--------------------
有些流的close方法并没有调用flush方法,所以还是手工调用下flush方法比较保险 --------------------编程问答-------------------- 1、处理流(过滤流)就是被Filter修饰的流类吗?如果不是,那处理流还包括什么?Filter不就包含了“过滤”的意思吗?(FilterInputStream、FilterOutputStream、FilterReadder、FilterWriter)
2、所有输出流都具有内存缓冲区吗?(OutputStream、Writer结尾的类是否都先缓存在一个缓冲区,等到一定条件后一并输出?)
3、输入流也具有缓冲区吗?
4、是不是只有处理流才具有缓冲区?
5、所有输出流都具有flush()方法吗?在关闭流资源前是不是必须flush()一下才能让输出流的数据真正输出?
6、输入流也有缓冲区的话,是不是在读取数据时也必须先flush()一下才可以呢?
先拿本操作系统看看吧
1.过滤器 ###Filter 是没实际意义的,他们的唯一作用就是作为 流装饰器的装饰器根
2.你所谓的缓冲区是内存缓冲区么? 还是内核 缓冲区?
用buffered 修饰的流都是基于内存缓冲区的, 如果你不用buffered 修饰 那么 编译器也会帮你修饰的,
说一下读函数的调用过程, 其实分为 进程调用 操作系统函数读,是从操作系统缓冲区读到 内存缓冲区,
我们在java 中的调用都是站在这个层面上的,具体的文件读,网络通信读是由操作系统实现的。
3.关于 flush 方法
public synchronized void flush() throws IOException {
flushBuffer();
out.flush();
}
private void flushBuffer() throws IOException {
if (count > 0) {
out.write(buf, 0, count);
count = 0;
}
}
上面是 BufferedInputStream的实现 你自己看吧。。flush 到底是什么 。 输入流是有缓冲区的 ,要么你不是每次读一个字节都要进行一次 系统调用? 这样 从 用户态切到内核太很费时间。所以 默认的实现 进程是一次把可读数据读入进程占有的内存缓冲区中 , 读入流没必要有flush方法 , 你写入要 flush干什么?
所谓阻塞IO 就是只 在 你调用 比如 你在 Socket上获得了一个 Inputstream 在这个上面调用read ,则 如果内核中没有数据可以读,那么进程就阻塞了。 而 所谓的NIO 提供的 非阻塞io ,这个过程在 调用 read()的时候是可以不阻塞的, 其它比如 选择器 和 异步IO就不详细说了弄本Nio的书看看吧。
建议你先看看操作系统或者组成原理吧 --------------------编程问答-------------------- 装饰模式,可以帮助你理解,, --------------------编程问答-------------------- 是过滤的意思啊!
后面加上I/O流,那就是过虑流咯!
补充:Java , Java SE