问:简单谈谈 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. 转载:mybatis中<![CDATA[]]>的作用

    作者:QH_JAVA 来源:CSDN 原文:https://blog.csdn.net/qh_java/article/details/50755655?utm_source=copy 在使用myba ...

  2. leetcode-mid-Linked list-160 Intersection of Two Linked Lists-NO

    mycode 用了反转链表,所以不符合题意 参考: 思路: 1 先让长的链表先走,然后相同长度下看是否相遇 class Solution(object): def getIntersectionNod ...

  3. Python编程:从入门到实践—函数

    从函数中修改列表 一家为用户提交的设计制作3D打印模型的公司,需要打印的设计存储在一个列表中,打印后移到另一个列表中. #!/usr/bin/env python # -*- coding:utf-8 ...

  4. mysql语句练习50题

    为了练习sql语句,在网上找了一些题,自己做了一遍,收益颇多.很多地方换一种思路,有更好的写法,欢迎指正. 题目地址:https://blog.csdn.net/fashion2014/article ...

  5. DelayQueue 源码分析

    DelayQueue DelayQueue 是基于 PriorityQueue 实现的线程安全的无界优先级阻塞队列, 队列的头部元素必须在超时后才能移除,元素必须实现 Delayed 接口. 创建实例 ...

  6. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_4_字节输出流写入数据到文件

    数据由内存写入到硬盘中 构造函数传的路径是一个相对路径.有异常需要捕获异常 释放资源 这三个方法,都有异常 IO异常是父类,所以这里只需要抛出IO异常就可以了. 运行程序.目录内多了个a.txt文件 ...

  7. JsonDatetime

    ToDatetime public DateTime JsonDateTimeConvert(string time) { //try //{ if (String.IsNullOrEmpty(tim ...

  8. 当我写下Map<String,Object> map = new HashMap<>() https://www.jianshu.com/p/6b2e350e99be

    当我写下Map<String,Object> map = new HashMap<>();我到底在写什么? 我什么时候会写HashMap? 一个函数同时需要返回 多种 状态的情 ...

  9. Visual Studio新增类模板修改

    C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\ItemTemplates\CSharp\Code\2052\Class ...

  10. new Date() 对象及方法:

    在别人的代码中见了两回 new Date().toLocaleString(),查了才知道,toLocaleString()是 根据本地时间格式,把 Date 对象转换为字符串.于是好奇new Dat ...