带你一文搞定 IO 流相关核心问题
问:简单谈谈 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 流相关核心问题的更多相关文章
- 一文搞定 SonarQube 接入 C#(.NET) 代码质量分析
1. 前言 C#语言接入Sonar代码静态扫描相较于Java.Python来说,相对麻烦一些.Sonar检测C#代码时需要预先编译,而且C#代码必须用MSbuid进行编译,如果需要使用SonarQub ...
- 一文搞定MySQL的事务和隔离级别
一.事务简介 事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成. 一个数据库事务通常包含了一个序列的对数据库的读/写操作.它的存在包含有以下两个目的: 为数据库操作序列提供 ...
- 一文搞定scrapy爬取众多知名技术博客文章保存到本地数据库,包含:cnblog、csdn、51cto、itpub、jobbole、oschina等
本文旨在通过爬取一系列博客网站技术文章的实践,介绍一下scrapy这个python语言中强大的整站爬虫框架的使用.各位童鞋可不要用来干坏事哦,这些技术博客平台也是为了让我们大家更方便的交流.学习.提高 ...
- 一文搞定Spring Boot + Vue 项目在Linux Mysql环境的部署(强烈建议收藏)
本文介绍Spring Boot.Vue .Vue Element编写的项目,在Linux下的部署,系统采用Mysql数据库.按照本文进行项目部署,不迷路. 1. 前言 典型的软件开发,经过" ...
- java中IO流相关知识点
(一) 下边使用outputStream字节输出流进行写操作 package zdbIO;import java.io.File;import java.io.FileNotFoundExceptio ...
- 21.SpringCloud实战项目-后台题目类型功能(网关、跨域、路由问题一文搞定)
SpringCloud实战项目全套学习教程连载中 PassJava 学习教程 简介 PassJava-Learning项目是PassJava(佳必过)项目的学习教程.对架构.业务.技术要点进行讲解. ...
- 一文搞定FastDFS分布式文件系统配置与部署
Ubuntu下FastDFS分布式文件系统配置与部署 白宁超 2017年4月15日09:11:52 摘要: FastDFS是一个开源的轻量级分布式文件系统,功能包括:文件存储.文件同步.文件访问(文件 ...
- 分布式作业 Elastic-Job 快速上手指南,从理论到实战一文搞定!
Elastic-Job支持 JAVA API 和 Spring 配置两种方式配置任务,这里我们使用 JAVA API 的形式来创建一个简单的任务入门,现在都是 Spring Boot 时代了,所以不建 ...
- 一文搞定Flask
Flask 一 .Flask简介 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收h ...
随机推荐
- 年薪100万的人都是怎么玩Excel的?
年薪100万的人都是怎么玩Excel的? 2017-12-21 13:42美国 作者:珍妮Jenny 来源:一周进步(ID:weekweekup) 本文已获原作者转载授权,如需转载请联系原公号 本文重 ...
- Android SDK Android NDK Android Studio 官方下载地址<转>
转自:http://www.cnblogs.com/yaotong/archive/2011/01/25/1943615.html 2016.10Android Studio 2.2.1.0https ...
- 【洛谷P1443 马的遍历】
题目链接(%%%jyy大佬) 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数 ...
- EnumMap 源码分析
EnumMap EnumMap 能解决什么问题?什么时候使用 EnumMap? 1)EnumMap[枚举映射]中的键值必须来自单个枚举. 2)EnumMap 根据枚举键的自然顺序来维护,迭代遍历是有序 ...
- python json字符串中有int类型数字(不带引号)
def jsonfy(s:str)->object: obj = eval(s, type('js', (dict,), dict(__getitem__=lambda s, n: n))()) ...
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_02 泛型_3_定义和使用含有泛型的类
创建一个类,添加一个name的属性,然后生成get和set 使用上面创建的类 使用泛型 所以我们取出来也是一个Object的类型 定义的时候规定的类型是Integer,所以这里setName设置的时候 ...
- 字符串中的TRIM操作
std::string& ltrim(std::string& str, const std::string& chars = "\t\n\v\f\r ") ...
- Python笔记(二十二)_魔法方法_基本魔法方法
__init__(self[,...]) __init__和__new__组成python的构造器,但__init__更多的是负责初始化操作,相当于一个项目中的配置文件,__new__才是真正的构造函 ...
- 使用lua实现try-catch异常捕获
lua原生并没有提供try-catch的语法来捕获异常处理,但是提供了pcall/xpcall等接口,可在保护模式下执行lua函数. 因此,可以通过封装这两个接口,来实现try-catch块的捕获机制 ...
- git 中添加用户名和密码
git 中添加用户名和密码:https://blog.csdn.net/qq_28602957/article/details/52154384 在使用git时,如果用的是HTTPS的方式,则每次提交 ...