前言
1、流
流(Stream):内存与存储设备之间传输数据的通道。
分类:
- 按方向:以内存为基准。
- 输入流:读操作,存储设备 → 内存。
- 输出流:写操作,内存 → 存储设备。
- 按处理单位:
- 字节流:字节,可以读写任意类型数据。
- 字符流:字符,只能读写文本类型数据。
- 按功能:
- 节点流:实际具有传输数据的功能(具体构件)。
- 过滤流:在节点流的基础之上增强功能(装饰者)
2、字节流
2.1、抽象类
InputStream
字节输入流
- read():从输入流中读取数据的下一个字节并返回。
- read(byte[]):从输入流中读取数据的一部分字节,存储到缓冲区并返回读取字节数量。
- read(byte[], off, len):从输入流中的偏移量 off 开始读取 len 个字节,存储到缓冲区并返回读取字节数量。
- close():关闭输入流,释放资源。
OutputStream
字节输出流
- write(int):将指定字节(ASCII 码)写入输出流。
- write(byte[]):将指定字节数组写入输出流。
- write(byte[], off, len):将指定字节数组中偏移量 off 开始的 len 个字节,写入到输出流。
- flush():刷新输出流,并将任何缓冲的字节写出。
- close():先调用 flush(),再关闭输出流,释放资源。
Hint:
write()
仅将数据写入流中,此时位于内存,还未写到磁盘文件。flush()
才将数据写到磁盘文件。
2.2、节点流
FileInputStream
使用步骤
-
创建流:参数为文件名
-
创建缓冲区:减少磁盘 I/O,提高效率
-
读取数据:直接读取磁盘文件
-
关闭流
public void readFile(String fileName) throws IOException { // 1、创建流 FileInputStream fis = new FileInputStream(fileName); // 2、缓冲区 byte[] buf = new byte[1024]; int len = 0; // 3、读取 while ((len = fis.read(buf)) != -1) { System.out.println(new String(buf, 0, len)); } // 4、关闭流 fis.close(); }
FileOutputStream
使用步骤
-
创建流:参数 1 为文件名,参数 2 表示是否写入方式。
- true:追加内容到文件中。
- false:覆盖文件。
-
写数据
-
刷新到磁盘
-
关闭流
public void writeFile(String location) throws IOException { // 1、创建流 FileOutputStream fos = new FileOutputStream(location, true); // 2、写 String str = "Hello, I/O world!"; fos.write(str.getBytes()); // 3、刷新 fos.flush(); // 4、关闭流 fos.close(); }
case:文件复制
思路:输入流读取文件数据,输出流写数据。
-
创建流
-
创建缓冲区:减少磁盘 I/O,提高效率
-
读写数据
-
关闭流:先开后关
public void copyFile(String source, String dest) throws IOException { // 1、创建流 FileInputStream fis = new FileInputStream(source); FileOutputStream fos = new FileOutputStream(dest); // 2、缓冲区 byte[] buf = new byte[1024]; int len = 0; // 3、读写 while ((len = fis.read(buf)) != -1) { fos.write(buf, 0, len); } // 4、关闭流:先开后关 fos.close(); fis.close(); }
2.3、缓冲流
Buffered Stream
属于过滤流(装饰者)
- 优点:提高 I/O 效率,减少磁盘访问次数。
- 内置缓冲区:在节点流的基础上增强的功能。
Buffered Stream
内置了一个缓冲区(默认大小 8K)。- 调用者对
Buffered Stream
的操作,都是在内置缓冲区的操作。
- 使用:
- 创建
Buffered Stream
时,需要传入节点流。 - 关闭
Buffered Stream
时,自动关闭节点流。
- 创建
读写流程
- 读:缓冲输入流
Buffered Stream
先使用节点流,读取一部分字节数到内置缓冲区。- 在内置缓冲区的数据读完之前,都是从内置缓冲区中读取。
- 写:缓冲输出流
Buffered Stream
先使用节点流,写入一部分字节数到内置缓冲区。- 在内置缓冲区的数据写完之前,都是从内置缓冲区中写出。
BufferedInputStream
使用步骤
Hint:此处缓冲区是节点流用于批量读取字节的缓冲区,不是缓冲流的内置缓冲区。
public void readFile(String filename) throws IOException {
// 1、创建流
FileInputStream fis = new FileInputStream(filename);
BufferedInputStream bis = new BufferedInputStream(fis);
// 2、缓冲区(Hint)
byte[] buf = new byte[1024];
int len = 0;
// 3、读取
while ((len = bis.read(buf)) != -1) {
System.out.print(new String(buf, 0, len));
}
// 3、关闭流
bis.close();
}
BufferedOutputStream
使用步骤
public void writeFile(String location) throws IOException {
// 1、创建流
FileOutputStream fos = new FileOutputStream(location);
BufferedOutputStream bos = new BufferedOutputStream(fos);
// 2、写
String str = "Hello, buffer I/O";
for (int i = 0; i < 10; i++) {
bos.write(str.getBytes());
// 3、刷新
bos.flush();
}
// 4、关闭流
bos.close();
}
case:文件复制
思路:输入流读取文件数据,输出流写数据。
-
创建流:节点流、过滤流
-
创建缓冲区
-
读写数据
-
关闭流:只需关闭过滤流,内部自动关闭节点流。
public void copyFile(String source, String dest) throws IOException { // 1、 创建流 FileInputStream fis = new FileInputStream(source); FileOutputStream fos = new FileOutputStream(dest); BufferedInputStream bis = new BufferedInputStream(fis); BufferedOutputStream bos = new BufferedOutputStream(fos); // 2、缓冲区 byte[] buf = new byte[1024]; int len = 0; // 3、读写 while ((len = bis.read(buf)) != -1) { bos.write(buf, 0, len); bos.flush(); } // 4、关闭连接 bos.close(); bis.close(); }
2.4、对象流
ObjectStream
字节流的子类,属于过滤流
增强功能:
- 内置缓冲区
- 读写对象:
- 序列化:向流中写入一个对象
- 反序列化:从流中读取一个对象
标签:String,IO,close,缓冲区,new,JavaSE,public,字节 From: https://www.cnblogs.com/secretmrj/p/17255045.html