时间:2021-05-19
java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题。
字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流。
问题引入:
缓冲流为什么比普通的文件字节流效率高?
不带缓冲的操作,每读一个字节就要写入一个字节。
由于涉及磁盘的IO操作相比内存的操作要慢很多,所以不带缓冲的流效率很低。
带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里。
等凑够了缓冲区大小的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,速度就会提高很多!
这就是两者的区别。
大概过程:
没有缓存区,那么每read一次,就会发送一次IO操作;
有缓存区,第一次read时,会一下读取x个字节放入缓存区,然后后续的read都会从缓存中读取,当read到缓存区末尾时,会再次读取x个字节放入缓存区。
很明显,第二种方式,会减少IO操作,效率更高,缺点就是,内存占用的多。
java输入输出流采用了多层封装的方式进行设计
最底层 InputStream和OutputStream 基于字节流,没有缓存机制,一般用BufferInputStream和BufferOutputStream进行封装后使用。
BufferInputStream的read方法是阻塞线程的,BufferInputStream.read(buf) 会将输入流内的全部读入buf之后才返回。
BufferOutputStream.write(buf);会将buf中的内容输出到输出流,但是记得要flush;
还有个比较好用的PrintStream 和PrintWriter相似 可以自动刷新 只不过是对于字节流而言。
字节流一般用于传送二进制文件之类 至于字符流常常用reader进行包装后使用。
最常用的有BufferInputStreamReader和PrintWrinter ,BufferInputStreamReader的readline方法很实用 遇到\r\d会自动flush。
PrintWrinter 只要在构造函数中设置了刷新属性为true则其println方法可以自动刷新不用flush。
FilterInputStream和FilterOutputStream:过滤流,buffer流和data流均继承于此。
对于buffer流,只有缓冲区满时,才会将数据真正到输出流,但可以使用flush()方法人为的将尚未填满的缓冲区中的数据送出;不能确定文件的编码方式,在网络上难以应用。
实际中用的最多的还是:data流可以让发送方和接收方按照同一的编码去处理。
DataInputStream和DataOutputStream:可以接受一行的数据,可以对其进行编码,也可以是套接流,可以套接文件字节流和网络字节流,读写的顺序要一致,否则读取会出现异常。
DataInputStream 是用来装饰其它输入流,它“允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型”。应用程序可以使用DataOutputStream(数据输出流)写入由DataInputStream(数据输入流)读取的数据。
以上所述是小编给大家介绍的Java.IO输入输出流 过滤流 buffer流和data流,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Java核心包java.io包介绍IO:Input/Ouput即输入输出输出流:程序(内存)—>外界设备输入流:外界设备—>程序(内存)处理理数据
Java中IO流字节流实例详解IO流(输入流、输出流),又分为字节流、字符流。 流是磁盘或其它外围设备中存储的数据的源点或终点。 输入流:程序从输入流读取数
IO:向设备输入数据和输出数据C++的IO流c++中,必须通过特定的已经定义好的类,来处理IO(输入输出)文件流:对文件进行读写操作头文件:类库:ifstrea
Java中java.io包为我们提供了输入流和输出流,对文件的读写基本上都依赖于这些封装好的关于流的类中来实现。前段时间遇到了以下两种需求: 1、与某系统
PHP输入和输出流是通过php://来访问的,它允许访问PHP的输入输出流、标准输入输出和错误描述符,内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资