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流的更多相关文章

  1. java IO输入输出流中的各种字节流,字符流类

    字节流字节流主要是操作byte类型数据,也byte数组为准,主要操作类就是·字节输出流:OutputStream·字节输入流:InputStream字符流在程序中一个字符等于2个字节,那么java提供 ...

  2. Java IO输入输出流 字符数组流 ByteArrayOutputStream/ByteArrayInputStream

    private static void StringWriterAndReader() throws Exception { //字符串流(字符串的内存流) //字符串输入流 StringWriter ...

  3. Java IO输入输出流 FileWriter 字符流

    字节缓冲流 //为什么要使用包装流,使用包装流是为了提高读写操作的性能. public class Packing_flowDemo { public static void main(String[ ...

  4. Java IO 输入输出流 详解 (一)***

    首先看个图: 这是Javaio 比较基本的一些处理流,除此之外我们还会提到一些比较深入的基于io的处理类,比如console类,SteamTokenzier,Externalizable接口,Seri ...

  5. Java——IO(输入输出流)

     *  * 想要知道开发时用到哪些数据对象,只要通过四个明确即可:  * 1.明确源,和目的:  * 源: InputStream reader  * 目的: OutPutStream Write ...

  6. Java - io输入输出流 --转换流

    转换流  转换输出流 OutputStreamWriter: 说明: /* * OutputStreamWriter 这个类的作用 * 就是指定输出流的编码格式 * 这个类的构造方法 需要传递 一个输 ...

  7. java io 输入输出流

    数据流分类: 流序列中的数据既可以是未经加工的原始二进制数据, 也可以是经一定编码处理后符合某种格式规定的特定数据. 因此Java中的流分为两种: 1) 字节流:数据流中最小的数据单元是字节 2) 字 ...

  8. Java IO输入输出流File 字节流

    public static void main(String[] args) throws IOException { //创建源 File f =new File("file/stream ...

  9. java IO输入输出流实现文本复制

随机推荐

  1. 纯CSS3实现的一些酷炫效果

    之前在网上看到一些用纯CSS3实现的酷炫效果,以为实现起来比较困难,于是想看看具体是怎么实现的. 一.笑脸猫动画 实现效果如下: 这个实现起来确实比较麻烦,很多地方需要花时间,有耐心地调整. 1.先看 ...

  2. Python高手之路【二】python基本数据类型

    一:数字 int int(整型): 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位系统上,整数的位数为64位,取值 ...

  3. pt-table-checksum

    pt-table-checksum是percona公司提供的一个用于在线比对主从数据一致性的工具. 实现原理 将一张大表分成多个chunk,每次针对一个chunk进行校验,同时将校验的结果通过REPL ...

  4. Partition:分区切换(Switch)

    在SQL Server中,对超级大表做数据归档,使用select和delete命令是十分耗费CPU时间和Disk空间的,SQL Server必须记录相应数量的事务日志,而使用switch操作归档分区表 ...

  5. 浅谈web攻防

    CSRF 跨站请求伪造(Cross-Site Request Forgery) -原理- 从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤: 1.登录受信任网站A,并在本地生成Coo ...

  6. 引人瞩目的 CSS 变量(CSS Variable)

    这是一个令人激动的革新. CSS 变量,顾名思义,也就是由网页的作者或用户定义的实体,用来指定文档中的特定变量. 更准确的说法,应该称之为 CSS 自定义属性 ,不过下文为了好理解都称之为 CSS 变 ...

  7. C#中将DataTable导出为HTML的方法

    今天我要向大家分享一种将DataTable导出为到HTML格式的方法.有时我们需要HTML格式的输出数据, 以下代码就可以帮助我们达到目的,. 首先,我们要绑定DataTable和 DataGridV ...

  8. 【C#附源码】数据库文档生成工具支持(Excel+Html)

    [2015] 很多时候,我们在生成数据库文档时,使用某些工具,可效果总不理想,不是内容不详细,就是表现效果一般般.很多还是word.html的.看着真是别扭.本人习惯用Excel,所以闲暇时,就简单的 ...

  9. python 数据类型 ----字典

    字典由一对key:value 组成的 python中常用且重量级的数据类型 1. key , keys, values 字典由一对key:value 组成的 python中常用且重量级的数据类型 1. ...

  10. WebLogic的安装和配置以及MyEclipse中配置WebLogic

    WebLogic 中间件: 是基础软件的一大类,属于可复用软件的范畴,顾名思义,中间件属于操作系统软件与应用软件的中间,比如:JDK,框架,weblogic. weblogic与tomcat区别 : ...