Java IO流
2020-05-18 本文已影响0人
_空格键_
什么是IO流
什么是IO,即输入(Input)/输出(Output)。无论计算机硬件设备(广义上讲所有电子硬件设备)、软件,都会有输入输出,不过硬件一般讲IO接口,软件讲IO流。
Java中为不同的输入/输出源(键盘、文件、网络连接等)抽象表述为流,并为其提供了标准的抽象类(InputStream/OutputStream等)。
Java IO流
位于 java.io.*
包下面,是 JDK1.0 提供的API。这个包下的IO操作都是阻塞的。
IO流的分类
- 按流向分类:输入流、输出流
- 按操作对象分类:字节流、字符流
- 按功能分类:节点流、处理流
- 节点流:可以从或向一个特定的地方(节点)读写数据(如FileReader)。
- 处理流:也称过滤流,是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写(如BufferedReader)。一般处理流的构造都需要传入节点流。
常用的几个基本类
- File: 用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等。
- InputStream: 抽象类、基于字节的输入操作、是所有输入流的父类、定义了所有输入流都具有的共同特征。
- OutputStream: 抽象类、基于字节的输出操作、是所有输出流的父类、定义了所有输出流都具有的共同特征。
- Reader: 抽象类、基于字符的输入操作;
- Writer: 抽象类、基于字符的输出操作;
- RandomAccessFile: 功能丰富,可以从文件的任意位置进行存取(输入输出)操作;
示例代码
1. 字节流
抽象类:InputStream
/OutputStream
实现子类:FileInputStream
/FileOutputStream
1.1. 节点流
FileInputStream
/FileOutputStream
文件字节流读写
1.1.1. 输入流
// 将被读取的文件,映射成一个文件对象
File file = new File("F:/test.txt");
// 开辟输入流
InputStream is = new FileInputStream(file);
// 读取数据,返回-1,说明文件读取结束
int ch;
while ((ch = is.read()) != -1) {
System.out.print((char) ch);
}
// 关闭流
is.close();
1.1.2. 输出流
// 如果文件不存在,会默认创建一个该文件
File file = new File("F:/test1.txt");
// 开辟输出流
OutputStream os = new FileOutputStream(file);
// 输出数据
String s = "asdfdfghdj";
byte[] bs = s.getBytes();
os.write(bs);
// 关闭流
os.close();
1.2. 过滤流
使用 装饰模式 对 节点流 包装。
1.BufferedInputStream
/BufferedOutputStream
// 加强节点流的功能:使用缓存加速文件读写
2.DataInputStream
/DataOutputStream
// 读写8中基本数据类型
3.ObjectInputStream
/ObjectOutputStream
//对象字节流读写,常用于Serializable的对象读写
1.2.1. 输入流
// 映射文件对象
File file = new File("D:/test.txt");
// 开辟输入流
FileInputStream is = new FileInputStream(file);
// 包装成过滤输入流
BufferedInputStream bis = new BufferedInputStream(is);
byte[] cbuff = new byte[10];
int len;
while ((len = bis.read(cbuff)) != -1) {
System.out.print(new String(cbuff, 0, len));
}
bis.close();
1.2.2. 输出流
// 映射文件对象
File file = new File("D:/test.txt");
// 开辟输出流
FileOutputStream os = new FileOutputStream(file);
// 包装成过滤输出流
BufferedOutputStream bos = new BufferedOutputStream(os);
byte[] ss = "hello world!".getBytes();
bos.write(ss);
bos.close();
2. 字符流
抽象类:Reader
/Writer
实现子类:InputStreamReader
/OutputStreamWriter
实现子类:FileReader
/FileWriter
2.1. 节点流
-
InputStreamReader
:是字节流通向字符流的桥梁 -
OutputStreamWriter
:是字符流通向字节流的桥梁
被读取/写入的文件的编码格式必须和桥转换时的编码格式一致
2.1.1. 输入流
// 映射文件对象
File file = new File("D:/test.txt");
// 开辟输入流
InputStream is = new FileInputStream(file);
// 桥转换(设置编码格式)new InputStreamReader(is)程序使用系统默认的编码格式进行解码
InputStreamReader read = new InputStreamReader(is, "utf-8");
char[] cs = new char[10];
read.read(cs);
// 将字符数组转换成字符串
String s = new String(cs);
System.out.println(s);
read.close();
2.1.2. 输出流
// 映射文件对象
File file = new File("D:/李白.txt");
// 开辟输出流
FileOutputStream os = new FileOutputStream(file);
// 桥转换(设置编码格式)
OutputStreamWriter osw = new OutputStreamWriter(os , "utf-8");
osw.write("窗前明月光");
osw.write("疑是地上霜");
osw.close();
2.2. 过滤流
也可称 字符缓冲流。
FileReader/FileWriter 用来读取/写入字符文件的便捷类
2.2.1. 输入流
// 映射文件对象
File file = new File("D:/test.txt");
// 开辟过滤输入流
FileReader reader = new FileReader(file);
char[] cbuff = new char[10];
int num;
while ((num = reader.read(cbuff)) != -1) {
System.out.print((new String(cbuff, 0, num)));
}
reader.close();
2.2.2. 输出流
// 映射文件对象
File file = new File("D:/test.txt");
// 开辟过滤输入流,如果文件有内容会覆盖
FileWriter writer = new FileWriter(file);
writer.write("hello world");
writer.close();
常用类继承关系图
后面自己重新整一个
