浅析Java.IO输入输出流 过滤流 buffer流和data流

 更新时间:2016年10月14日 11:47:58   作者:Carrol  
这篇文章主要介绍了Java.IO输入输出流 过滤流 buffer流和data流的相关资料,本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下

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流,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Java杂谈之重复代码是什么

    Java杂谈之重复代码是什么

    刚开始工作时,总有人开玩笑说,编程实际上就是 CV,调侃很多程序员写程序依靠的是复制粘贴。至今,很多初级甚至高级程序员写代码依旧是CV,就是把其他项目里的一段代码复制过来,稍加改动,然后,跑一下没有大问题就完事。这就是在给其他人挖坑
    2021-09-09
  • mybatis-plus @DS实现动态切换数据源原理

    mybatis-plus @DS实现动态切换数据源原理

    本文主要介绍了mybatis-plus @DS实现动态切换数据源原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Spring Boot异常处理问题小结

    Spring Boot异常处理问题小结

    在 Spring Boot 中,异常处理是一个重要的部分,可以允许开发者优雅地处理应用程序中可能发生的错误和异常,这篇文章主要介绍了Spring Boot异常处理问题小结,需要的朋友可以参考下
    2024-05-05
  • 一起聊聊Java中的自定义异常

    一起聊聊Java中的自定义异常

    在学习Java的过程中,想必大家都一定学习过异常这个篇章,异常的基本特性和使用这里就不再多讲了。本文就来和大家讲讲如何自定义异常
    2022-08-08
  • mybatis分页绝对路径写法过程详解

    mybatis分页绝对路径写法过程详解

    这篇文章主要介绍了mybatis分页绝对路径写法过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • java、spring、springboot中整合Redis的详细讲解

    java、spring、springboot中整合Redis的详细讲解

    这篇文章主要介绍了java、spring、springboot中整合Redis的详细讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Spring Cloud gateway 网关如何拦截Post请求日志

    Spring Cloud gateway 网关如何拦截Post请求日志

    这篇文章主要介绍了Spring Cloud gateway 网关如何拦截Post请求日志的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SpringMVC实现文件下载功能

    SpringMVC实现文件下载功能

    这篇文章主要为大家详细介绍了SpringMVC实现文件下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • SpringBoot 任务调度动态设置方式(不用重启服务)

    SpringBoot 任务调度动态设置方式(不用重启服务)

    这篇文章主要介绍了SpringBoot 任务调度 动态设置方式(不用重启服务),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 在Spring MVC中处理请求参数的方法总结

    在Spring MVC中处理请求参数的方法总结

    在Spring MVC中处理请求参数是通过使用各种注解来实现的,本文给大家介绍了在Spring MVC中处理不同类型请求参数的方法,并通过代码讲解的非常详细,需要的朋友可以参考下
    2024-08-08

最新评论