当前位置:编程学习 > JAVA >>

关于IO流操作方面的几个疑问

1、处理流(过滤流)就是被Filter修饰的流类吗?如果不是,那处理流还包括什么?Filter不就包含了“过滤”的意思吗?(FilterInputStream、FilterOutputStream、FilterReadder、FilterWriter)
2、所有输出流都具有内存缓冲区吗?(OutputStream、Writer结尾的类是否都先缓存在一个缓冲区,等到一定条件后一并输出?)
3、输入流也具有缓冲区吗?
4、是不是只有处理流才具有缓冲区?
5、所有输出流都具有flush()方法吗?在关闭流资源前是不是必须flush()一下才能让输出流的数据真正输出?
6、输入流也有缓冲区的话,是不是在读取数据时也必须先flush()一下才可以呢?

对IO一窍不通,望各位朋友能给予帮助,谢谢~~ --------------------编程问答-------------------- 是不是具有flush()方法的所有类都是用缓冲区呢? --------------------编程问答--------------------
引用 1 楼 yl_521 的回复:
是不是具有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中秋快乐!


--------------------编程问答--------------------
引用 5 楼 itbasketplayer 的回复:
1.处理流(过滤流)就是被Filter修饰的流类吗?并不是这样的,过滤流还称装饰类,只是扩展了进一步处理数据的功能,它们的构造必须使用一个已经存在的输入流/输出流,并用它进行实际的读写。比如缓存流 BufferedInputStream/BufferedOutputStream,只有一个flush()起了作用;数据流 DataInputStream/DataOutputStream以Java 基本……

其实close()方法就包括了.flush()了 --------------------编程问答--------------------
引用 6 楼 niuniu20008 的回复:
引用 5 楼 itbasketplayer 的回复:
1.处理流(过滤流)就是被Filter修饰的流类吗?并不是这样的,过滤流还称装饰类,只是扩展了进一步处理数据的功能,它们的构造必须使用一个已经存在的输入流/输出流,并用它进行实际的读写。比如缓存流 BufferedInputStream/BufferedOutputStream,只有一个flush()起了作用;数据流 DataInputSt……

有些流的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
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,