Java中的IO结构
一:Java IO中常用的类
主要的类如下:
- File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等。
- InputStream(二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征。
- OutputStream(二进制格式操作):抽象类。基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征。
- Reader(文件格式操作):抽象类,基于字符的输入操作。
- Writer(文件格式操作):抽象类,基于字符的输出操作。
- RandomAccessFile(随机文件操作):一个独立的类,直接继承至Object.它的功能丰富,可以从文件的任意位置进行存取(输入输出)操作。
之间的 的关系图如下:
二:Java IO中的流
Java中将输入和输出抽象成流,流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流。
IO流的分类
- 根据处理数据类型的不同分为:字符流和字节流
- 根据数据流向不同分为:输入流和输出流
- 按数据来源(去向)分类:
1. File(文件): FileInputStream, FileOutputStream, FileReader, FileWriter
2. byte[]:ByteArrayInputStream, ByteArrayOutputStream
3. Char[]: CharArrayReader,CharArrayWriter
4. String: StringBufferInputStream, StringReader, StringWriter
5. 网络数据流:InputStream,OutputStream, Reader, Writer
三:字符流和字节流:
流序列中的数据既可以是未经加工的原始二进制数据,也可以是经一定编码处理后符合某种格式规定的特定数据。因此Java中的流分为两种,字节流和字符流。
- 字节流
- 数据流中最小的数据单元是字节
- 代表的基本类是InputStream和OutputStream
- 从字节流中读取字节的方法read。默认没有使用内存缓冲区,意味着每调用一次read方法都会请求操作系统来读取一个字节,这往往会伴随着一次磁盘IO,因此效率会比较低。
- 字符流
- Java中的字符流处理的最基本的单元是Unicode编码(大小2字节),它通常用来处理文本数据
- 代表的基本类是 Reader和Writer
- 使用内存缓冲区来存放转换后得到的字节序列,等待都转换完毕再一同写入磁盘文件中。
- 字符流的由来: Java中字符是采用Unicode标准,一个字符是16位,即一个字符使用两个字节来表示。为此,JAVA中引入了处理字符的流。因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。
流的原理梳理
Java io流设计到的类有40多个,实际上这40多个类都是从下面的4个抽象类派生出来的
* 字节流:
- InputStream:所有字节流的输入流基类
- OutputStram:所有字节流的输出流基类
* 字符流:
- Reader:所有字符流的输入流基类
- Writer:所有字符流的输出流基类
四:输出流和输入流
根据数据的输入、输出方向的不同对而将流分为输入流和输出流。
- 输入流:
- 程序从输入流读取数据源。数据源包括外界(键盘、文件、网络…),即是将数据源读入到程序的通信通道
- 例如字节流的InputStream 和 字符流的Reader - 输出流
- 程序向输出流写入数据。将程序中的数据输出到外界(显示器、打印机、文件、网络…)的通信通道。
- 例如字节流中的OutputStream 和 字符流中的Writer
特性:
相对于程序来说,输出流是往存储介质或数据通道写入数据,而输入流是从存储介质或数据通道中读取数据,一般来说关于流的特性有下面几点:
- 先进先出,最先写入输出流的数据最先被输入流读取到。
- 顺序存取,可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数。(RandomAccessFile可以从文件的任意位置进行存取(输入输出)操作)
- 只读或只写,每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流
参考文档 https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/Java%20IO%E4%B8%8ENIO.md
参考文档 https://www.cnblogs.com/ylspace/p/8128112.html
参考文档 https://www.cnblogs.com/shamo89/p/9860582.html