问:简单谈谈 Java IO 流各实现类的特性?

答:java.io 包下面的流基本都是装饰器模式的实现,提供了各种类型流操作的便携性,常见的流分类如下。

以二进制字节方式读写的流:

  • InputStream、OutputStream: 二进制字节读写抽象类型的基类。

  • FileInputStream、FileOutputStream: 输入输出目标是文件的流,构造支持 File 类型和 String 文件名类型及追加覆盖模式,以 byte 或 byte 数组读写文件,FileOutputStream 没有缓冲,没有重写flush,调用 flush 没有任何效果,数据只是传递给了操作系统,但操作系统什么时候保存到硬盘上是不一定的,按字节读取效率低。

  • ByteArrayInputStream、ByteArrayOutputStream: 输入输出目标是字节数组的流,数组的长度是根据数据内容动态扩展的,ByteArrayOutputStream 无缓存,同理 flush 无效。

  • DataInputStream、DataOutputStream: 按基本类型和字符串而非只是字节读写流装饰类,FilterInputStream、FilterOutputStream 装饰基类的子类,在写入时 DataOutputStream 会将这些类型的数据转换为其对应的二进制字节,必须按照字节读取,效率较低。

  • BufferedInputStream、BufferedOutputStream: 对输入输出流提供缓冲功能的装饰类,BufferedInputStream 内部有个字节数组作为缓冲区,读取时先从这个缓冲区读,缓冲区读完了再调用包装的流读,BufferedOutputStream 的构造方法也有两个,默认的缓冲区大小也是 8192,它的 flush 方法会将缓冲区的内容写到包装的流中。

  • PipedInputStream、PipedOutputStream:分别是管道输入输出流,作用是让多线程可以通过管道进行线程间的通讯,在使用管道通信时,必须将 PipedOutputStream 和 PipedInputStream 配套使用。

  • PrintStream:继承于 FilterOutputStream 来装饰其它输出流的流。提供了自动 flush 和字符集设置功能。

以文本字符方式读写的流(文本文件中编码非常重要)主要有:

  • Reader、Writer:字符流的抽象基类。

  • InputStreamReader、OutputStreamWriter:适配器类,输入是 InputStream,输出是 OutputStream,将字节流转换为字符流,一个重要的参数是编码类型,如果没有传则为系统默认编码。

  • FileReader、FileWriter:输入输出目标是文件的字符流,InputStreamReader、OutputStreamWriter 的子类,需要注意的是 FileReader、FileWriter 不能指定编码类型,只能使用默认编码,如果需要指定编码类型可以使用 InputStreamReader、OutputStreamWriter。

  • CharArrayReader、CharArrayWriter: 输入输出目标是 char 动态调整数组的字符流,类似 ByteArrayInputStream、ByteArrayOutputStream。

  • StringReader、StringWriter:输入输出目标是 String 的字符流,与 CharArrayReader、CharArrayWriter 类似。

  • BufferedReader、BufferedWriter:装饰类,对输入输出流提供缓冲以及按行读写功能,FileReader、FileWriter 是没有缓冲的、也不能按行读写,所以一般应该在它们的外面包上对应的缓冲类。

  • PrintWriter:装饰类,可直接指定文件名作为参数、可以指定编码类型、可以自动缓冲、可以自动将多种类型转换为字符串,在输出到文件时可以优先选择该类。

  • PipedReader、PipedWriter:分别是字符管道输入输出流,作用是让多线程可以通过管道进行线程间的通讯,在使用管道通信时,必须将 PipedReader、PipedWriter 配套使用。

带你一文搞定 IO 流相关核心问题的更多相关文章

  1. 一文搞定 SonarQube 接入 C#(.NET) 代码质量分析

    1. 前言 C#语言接入Sonar代码静态扫描相较于Java.Python来说,相对麻烦一些.Sonar检测C#代码时需要预先编译,而且C#代码必须用MSbuid进行编译,如果需要使用SonarQub ...

  2. 一文搞定MySQL的事务和隔离级别

    一.事务简介 事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成. 一个数据库事务通常包含了一个序列的对数据库的读/写操作.它的存在包含有以下两个目的: 为数据库操作序列提供 ...

  3. 一文搞定scrapy爬取众多知名技术博客文章保存到本地数据库,包含:cnblog、csdn、51cto、itpub、jobbole、oschina等

    本文旨在通过爬取一系列博客网站技术文章的实践,介绍一下scrapy这个python语言中强大的整站爬虫框架的使用.各位童鞋可不要用来干坏事哦,这些技术博客平台也是为了让我们大家更方便的交流.学习.提高 ...

  4. 一文搞定Spring Boot + Vue 项目在Linux Mysql环境的部署(强烈建议收藏)

    本文介绍Spring Boot.Vue .Vue Element编写的项目,在Linux下的部署,系统采用Mysql数据库.按照本文进行项目部署,不迷路. 1. 前言 典型的软件开发,经过" ...

  5. java中IO流相关知识点

    (一) 下边使用outputStream字节输出流进行写操作 package zdbIO;import java.io.File;import java.io.FileNotFoundExceptio ...

  6. 21.SpringCloud实战项目-后台题目类型功能(网关、跨域、路由问题一文搞定)

    SpringCloud实战项目全套学习教程连载中 PassJava 学习教程 简介 PassJava-Learning项目是PassJava(佳必过)项目的学习教程.对架构.业务.技术要点进行讲解. ...

  7. 一文搞定FastDFS分布式文件系统配置与部署

    Ubuntu下FastDFS分布式文件系统配置与部署 白宁超 2017年4月15日09:11:52 摘要: FastDFS是一个开源的轻量级分布式文件系统,功能包括:文件存储.文件同步.文件访问(文件 ...

  8. 分布式作业 Elastic-Job 快速上手指南,从理论到实战一文搞定!

    Elastic-Job支持 JAVA API 和 Spring 配置两种方式配置任务,这里我们使用 JAVA API 的形式来创建一个简单的任务入门,现在都是 Spring Boot 时代了,所以不建 ...

  9. 一文搞定Flask

    Flask 一 .Flask简介 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收h ...

随机推荐

  1. (转)Matplotlib的子图subplot的使用

    转:https://www.jianshu.com/p/de223a79217a 前言 Matplotlib的可以把很多张图画到一个显示界面,这就设计到面板切分成一个一个子图.这是怎么做到的呢.mat ...

  2. 谷歌 AXURE RP EXTENSION拓展问题

    我们打开某种文件页面是 会提示我们下载 AXURE RP EXTENSION 拓展. 其实我们可以直接用ie浏览器打开即可,不用下载

  3. (转)flexpaper 参数

    本文转载自:http://blog.csdn.net/z69183787/article/details/18659913 Flexpaper可能用到如下参数   SwfFile (String) 需 ...

  4. 008-elasticsearch5.4.3【二】ES使用、ES客户端、索引操作【增加、删除】、文档操作【crud】

    一.ES使用,以及客户端 1.pom引用 <dependency> <groupId>org.elasticsearch.client</groupId> < ...

  5. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_01 File类_2_File类的静态成员变量

    四个静态方法 打印的是一个分号 我们在配置java的环境变量的时候,路径就是以分号分隔开的 windows重视分好.linux是冒号 输出反斜线 选中这两个和上面的是一样的 只不过返回的是char类型 ...

  6. Lucene的步骤

    // 1. 采集数据 BookDao bookDao = new BookDaoImpl(); List<Book> bookList = bookDao.queryBookList(); ...

  7. 【USACO18JAN】MooTube

    原文链接:https://blog.csdn.net/Patrickpwq/article/details/86656456 给定一棵n个点的树(n=1e5),有边权, 两点间距离定义为两点路径上的 ...

  8. Temporal-Difference Learning for Prediction

    In Monte Carlo Learning, we've got the estimation of value function: Gt is the episode return from t ...

  9. Java之九九乘法表

    public class MultiplicationTable { public static void main(String[] args) { for(int i=1;i<=9;i++) ...

  10. 极*Java速成教程 - (2)

    Java语言基础 Java的一切都是以对象为基础,对象是生是死的生命周期由虚拟机管理,但是在创生和消亡阶段,需要我们去管理这个类怎么生,怎么死.我们也以此为契机,慢慢接触Java的诸多细节和具体实现. ...