带你一文搞定 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 ...
随机推荐
- Web引用中文个性字体
最近在前端开发时,因为设计的原因,要引用一些特殊字体(otf格式),但是后来发现这些字体文件非常大,平均每个要8mb左右,严重影响了网页效率.经过一番搜索,发现了前端字体压缩工具(只支持utf-8格式 ...
- 微信小程序 form 组件
表单组件:将组件内用户输入的 <switch> <input> <checkbox> <slider> <radio> <picker ...
- React-Native 之 GD (十一)加载更多功能完善 及 跳转详情页
1.加载更多功能完善 GDHome.js /** * 首页 */ import React, { Component } from 'react'; import { StyleSheet, Text ...
- React-Native 之 GD (五)属性声明和属性确认 及 占位图
1.在 React-Native 创建的自定义组件是可以复用的,而开发过程中一个组件可能会由多个人同时开发或者多个人使用一个组件,为了让开发人员之间减少沟通成本,我们会对某些必要的属性进行属性声明,让 ...
- Linux内核调试方法总结之栈帧
栈帧 栈帧和指针可以说是C语言的精髓.栈帧是一种特殊的数据结构,在C语言函数调用时,栈帧用来保存当前函数的父一级函数的栈底指针,当前函数的局部变量以及被调用函数返回后下一条汇编指令的地址.如下图所示: ...
- codeforces 668C - Little Artem and Random Variable
题目链接:http://codeforces.com/contest/668/problem/C --------------------------------------------------- ...
- COUNT(*) vs COUNT(col)
w https://www.percona.com/blog/2007/04/10/count-vs-countcol/
- How to derive mean and variance of a Gaussian?
PRML exercise 1.8: To derive mean: change of variable z = x - u, use symmetry To derive variance: di ...
- ubuntu安装和使用git
1.apt-get安装 apt-get install git 2.全局配置 git config --global user.name "yourname" git config ...
- MongoDB--(NoSQL)入门介绍
NoSQL中比较优秀的产品 windows 下载安装 shell 基本操作(javascript 引擎) BSON扩充的数据类型(JSON的扩展,浮点型,日期型的扩充) step1.创建数据库 use ...