java I/O知识点总结
nio和io区别详解
https://www.cnblogs.com/hapjin/p/5736188.html
1、I/O操作相关类和接口
类 | 说明2 |
---|---|
File | 文件类,代表一个特定文件信息,或代表一个目录下的一组文件 |
InputStream | 字节输入流接口,表示从不同数据源产生输入的类 |
OutputStream | 字节输出流接口,表示数据输出的目标 |
Read | 字符输入流接口 |
Writer | 字符输出流接口 |
Read和Writer提供兼容Unicode与面向字符的I/O功能。
1.1、File类简介
** File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名getName()、文件长度length()、最后修改时间lastModified()、是否可读写canRead()、canWrite()、获取文件的路径getPath(),判断文件是否存在exists()、获得当前目录中的文件列表list()、创建mkdirs()、删除delete()等方法。**
package io.iosystem;
import java.io.File;
import java.io.FilenameFilter;
public class DirList {
public static void main(String[] args) {
File path = new File(".");
System.out.println("绝对路径: " + path.getAbsolutePath());
System.out.println("可读写: " + path.canRead() + " " + path.canWrite());
System.out.println("文件名: " + path.getName());
System.out.println("最后修改时间: " + path.lastModified());
// list()方法可接受一个FilenameFilter对象,
// 作为策略模式,list会回调FilenameFilter.accept()方法,允许我们对文件夹中的子文件名称做额外的处理
// 如下,只会返回文件名小于10字符的文件名组
String[] list = path.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.length() < 5 ? true : false;
}
});
for (String s : list) {
System.out.println(s);
}
}
}
/*output:
绝对路径: D:\IdeaProjects\Test\thinkingInJava\.
可读写: true true
文件名: .
最后修改时间: 1548920209829
file
out
src
*/
2、I/O流类结构图
3、流的概念和作用
java流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,==流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作
。
4、IO流的分类
根据处理数据类型的不同分为:字符流和字节流
根据数据流向不同分为:输入流和输出流
4.1、字符流和字节流
字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。 字节流和字符流的区别:
读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
处理对象不同:字节流能处理所有类型的数据(如图片、视频等),而字符流只能处理字符类型的数据。
所以只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。
4.2、输入流和输出流
对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。
5、Java IO流对象简介
代表任何有能力生产数据的数据源对象或者又能力接受数据端的对象。
5.1、字节流的输入和输出的结构
图中蓝色为输入输出对应部分,红色为不对应的部分,绿色部分已被弃用Deprecated不推荐使用,紫色虚线部分代表这些流一般需要搭配使用。
5.1.1、输入字节流
InputStream: 抽象类,是所有的输入字节流的父类。
ByteArrayInputStream:作为一种数据源,用于从byte数组中读取数据(构造器参数->byte数组)。
FileInputStream:作为一种数据源,用于从本地文件中读取数据(构造器参数->文件对象File,文件名字符串,或FileDescriptor对象)。
ObjectInputStream: 和所有FilterInputStream 的子类都是装饰流(装饰器模式的主角),用于java序列化支持(构造器参数->InputStream对象)。
PipedInputStream:作为多线程的数据源,用于从与其它线程共用的管道中读取数据(构造器参数->PipedOutputStream对象)。
FilterInputStream:抽象类,作为“装饰器”的接口,为InputStream类提供更丰富的功能。
SequenceInputStream:可以认为是一个工具类,将两个或者多个输入流当成一个输入流依次读取。
StringBufferInputStream:[已弃用Deprecated]作为一种数据源,用于从字符串中读取数据,底层实现使用StringBuffer(构造器参数->字符串)。
BufferedInputStream:FilterInputStream子类,使用缓冲区进行读取(构造器参数->InputStream,可指定缓冲区大小,可选值)。
DataInputStream:FilterInputStream子类,与DataOutputStream搭配使用,可以从流中取出基本的数据类型(int、char、long等)(构造器参数->InputStream)。
LineNumberInputStream:FilterInputStream子类,[已弃用Deprecated]可以跟踪流中的行号,getLineNumber()、setLineNumber(int)方法(构造器参数->InputStream)。
PushbackInputStream:FilterInputStream子类,查看最后一个字节,不满意就放入缓冲区。主要用在编译器的语法、词法分析部分(构造器参数->InputStream)。
5.1.2、输出字节流
OutputStream:抽象类,是所有的输出字节流的父类。
ByteArrayOutputStream:向byte 数组中写入数据(构造器参数->初始