java IO流的种类
1、按照流向划分:输入流和输出流 2、按照操作单元划分:字节流和字符流 3、按照流的角色划分:节点流和处理流
java的io流均是从以下类派生出的 字符流 Reader/Writer 字节流 InputstreamWriter/OutputStreamWriter
既然有了字节流,为什么还要有字符流?
字符流是由 Java 虚拟机将字节转换得到的,问题就出在这个过程还算是非常耗时,并且,如果我们不知道编码类型就很容易出现乱码问题。所以, I/O 流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好。
文件处理
FileInputStream和FileOutputStream FileReader和FileWriter
缓冲流
BufferedInputStream和BufferedOutputStream BufferedReader和BufferedWriter
转换流
Java IO流中提供了两种用于将字节流转换为字符流的转换流。其中InputStreamReader用于将字节输入流转换为字符输入流,其中OutputStreamWriter用于将字节输出流转换为字符输出流。使用转换流可以在一定程度上避免乱码,还可以指定输入输出所使用的字符集
对象流
ObjectOutputStream和ObjectInputStream
首先为什么要设置缓冲
如果不设置缓冲的话,CPU取一个存一个。设置缓冲区的话:就好比是把基础流用DMA方式包装起来如下:
CPU通常会使用 DMA 方式去执行 I\O流 操作。CPU 将这个工作交给DMA控制器来做,自己腾出时间做其他的事,当DMA完成工作时,DMA会主动告诉CPU“操作完成”。这时,CPU接管后续工作。在此,CPU 是被动的。DMA是专门 做 I\O 与 内存 数据交换的,不仅自身效率高,也节约了CPU时间,CPU在DMA开始和结束时做了一些设置罢了。 缓冲区就是内存里的一块区域,把数据先存内存里,然后一次性写入,类似数据库的批量操作,显然效率比较高。还节省CPU的使用。
总结:使用缓冲处理流包装就是一堆一堆的干活,还能不用CPU多次处理数据转换,只是设置一下数据转换成功后的文件。
|