IO流
分类及结构


字节流

FileOutStream原理
创建流对象:
通过 new FileOutputStream("C:\\a.txt") 建立程序与目标文件(C:\a.txt)的连接。
写出数据:
调用 fos.write(97),将字节数据(97 对应 ASCII 码的字符a)写入文件。
关闭流资源:
调用 fos.close(),释放程序与文件的连接资源。
注:如果不关闭流资源,程序运行完毕之前此文件一直处于使用状态,无法在外部对此文件操作
FileOutputStream 书写细节
① 创建字节输出流对象
- 细节 1:参数可以是字符串路径或File 对象
- 细节 2:文件不存在时会自动创建,但需保证父级路径已存在
- 细节 3:文件已存在时,会清空原有内容
② 写数据
- 细节:
write方法接收整数参数,但实际写入的是该整数对应的ASCII 字符
③ 释放资源
- 细节:每次使用完流后,必须手动释放资源
FileOutputStream 写数据的 3 种方式
| 方法名称 | 说明 |
|---|---|
void write(int b) | 一次写一个字节数据 |
void write(byte[] b) | 一次写一个字节数组数据 |
void write(byte[] b, int off, int len) | 一次写一个字节数组的部分数据 |
样例
import java.io.FileOutputStream;
import java.io.IOException;
public class StreamDemo4 {//此处抛出的异常时编译时异常,是创建流,写入和关闭资源的异常的父类
public static void main(String[] args) throws IOException {
// 1. 创建FileOutputStream对象(路径为"myio\\a.txt")此处为相对路径
FileOutputStream fos = new FileOutputStream("myio\\a.txt");
// 2. 写出数据
// 写出字符串"kankelaoyezuishuai"
String str = "kankelaoyezuishuai";
byte[] bytes1 = str.getBytes();
fos.write(bytes1);
// 写出换行符(\r\n是Windows下的换行格式)
String wrap = "\r\n";
byte[] bytes2 = wrap.getBytes();
fos.write(bytes2);
// 写出字符串"666"
String str2 = "666";
byte[] bytes3 = str2.getBytes();
fos.write(bytes3);
// 3. 释放资源
fos.close();
}
}
注:
不同系统的换行符
- Linux:
\n - Mac:
\r
Windows 换行细节
在 Windows 系统中,Java 对回车换行做了优化:
- 完整换行符是
\r\n,但写\r或\n其中一个,Java 底层会自动补全实现换行,其中\r代表光标来到此行的开头,\n为直接换行。 - 建议:不要省略,写全
\r\n。
续写功能
- 若要续写,需打开续写开关(创建对象时的第二个参数):
- 默认
false:关闭续写,创建对象时会清空文件原有内容。 - 手动传
true:打开续写,创建对象时不会清空文件,新内容会追加到文件末尾。
- 默认
//1.创建对象
FileOutputStream fos = new FileOutputStream("myio\\a.txt",true)
//2.写出数据
String str = "kankelaoyezuishuai";
byte[] bytes1 = str.getBytes();
fos.write(bytes1);
FileOutStream原理
FileInputStream 的书写细节
① 创建字节输入流对象
- 细节 :如果目标文件不存在,会直接抛出异常。
② 读取数据
- 细节 1:一次读一个字节,返回的是该字节对应的ASCII 数值(比如读取字符
a会返回 97)。 - 细节 2:当读到文件末尾时,
read方法会返回-1(以此作为读取结束的标志)。
③ 释放资源
- 细节 :每次使用完流后,必须手动释放资源。
FileInputStream 一次读多个字节

FileInputStream 一次读多个字节

改善方法

方法列表
| 方法名称 | 说明 |
|---|---|
public int read() | 一次读一个字节数据,返回值读取为对应字节 |
public int read(byte[] buffer) | 一次读一个字节数组数据,返回值读取为字节长度,字节存在byte中 |
注意事项
- 使用
read(byte[] buffer)时,每次读取会尽可能将字节数组装满。 - 字节数组的常用大小建议:1024 的整数倍(例如
1024*1024*5,即 5MB)。
字符集基础知识
计算机中任意数据都以二进制形式存储。
计算机最小存储单元是 1 个字节。
ASCII 字符集中,1 个英文字符占 1 个字节。
简体中文版 Windows 默认使用 GBK 字符集。
GBK 字符集完全兼容 ASCII 字符集:
- 英文字符:占 1 个字节,二进制第一位是
0。 - 中文字符:占 2 个字节,二进制高位字节的第一位是
1。
Unicode 字符集的 UTF-8 编码格式:
- 英文字符:占 1 个字节,二进制第一位是
0,转成十进制为正数。 - 中文字符:占 3 个字节,二进制第一位是
1,第一个字节转成十进制为负数。
java中编码解码方式
| 操作类型 | 方法声明 | 说明 |
|---|---|---|
| 编码 | public byte[] getBytes() | 使用默认方式进行编码 |
| 编码 | public byte[] getBytes(String charsetName) | 使用指定方式进行编码 |
| 解码 | String(byte[] bytes) | 使用默认方式进行解码 |
| 解码 | String(byte[] bytes, String charsetName) | 使用指定方式进行解码 |
字符流

FileReader
① 创建字符输入流对象
-
构造方法:
构造方法 说明 public FileReader(File file)关联本地文件(参数为 File 对象) public FileReader(String pathname)关联本地文件(参数为字符串路径) -
细节:如果目标文件不存在,会直接抛出异常。
② 读取数据
-
成员方法:
成员方法 说明 public int read()读取数据,读到末尾返回 - 1,读入数据为返回的int public int read(char[] buffer)读取多个数据,读到末尾返回 - 1,读取数据存入字符数组中(十进制形式),返回读取字符长度 -
细节:
- 按字节读取,遇到中文字符时会一次读多个字节,解码后返回对应整数(代表字符)。
- 读到文件末尾时,
read方法返回-1。
③ 释放资源
-
成员方法:
成员方法 说明 public int close()释放资源 / 关闭流
样例
无参
// 1. 创建FileReader对象(关联文件:myio\a.txt)
FileReader fr = new FileReader("myio\\a.txt");
// 2. 读取数据(read()方法)
int ch;
// 循环读取,直到返回-1(文件末尾)
while ((ch = fr.read()) != -1) {
// 将十进制返回值强转为char,显示对应字符
System.out.print((char) ch);
}
// 3. 释放资源
fr.close();
有参
// 1. 创建FileReader对象(关联文件:myio\a.txt)
FileReader fr = new FileReader("myio\\a.txt");
// 2. 读取数据(字符数组缓冲)
char[] chars = new char[2]; // 定义长度为2的字符数组
int len;
// 循环读取,直到返回-1(文件末尾)
while ((len = fr.read(chars)) != -1) {
// 将字符数组转为字符串(取实际读取的长度len)
System.out.print(new String(chars, 0, len));//从零索引开始
}
// 3. 释放资源
fr.close();
FileWriter
FileWriter 的构造方法
| 构造方法 | 说明 |
|---|---|
public FileWriter(File file) | 创建字符输出流关联本地文件 |
public FileWriter(String pathname) | 创建字符输出流关联本地文件 |
public FileWriter(File file, boolean append) | 创建字符输出流关联本地文件,支持续写 |
public FileWriter(String pathname, boolean append) | 创建字符输出流关联本地文件,支持续写 |
FileWriter 的书写细节
① 创建字符输出流对象
- 细节 1:参数可以是字符串路径或File 对象。
- 细节 2:文件不存在时会自动创建,但需保证父级路径已存在。
- 细节 3:文件已存在时会清空原有内容;若要保留内容,需打开续写开关(构造方法的
append参数传true)。
② 写数据
- 细节:
write方法接收整数参数时,实际写入的是该整数在字符集中对应的字符(例如传入97会写入a)。
③ 释放资源
- 细节:每次使用完流后,必须手动释放资源。
| 方法声明 | 说明 | |
|---|---|---|
| 写数据 | void write(int c) | 写出一个字符 |
| 写数据 | void write(String str) | 写出一个字符串 |
| 写数据 | void write(String str, int off, int len) | 写出字符串的一部分 |
| 写数据 | void write(char[] cbuf) | 写出一个字符数组 |
| 写数据 | void write(char[] cbuf, int off, int len) | 写出字符数组的一部分 |
| 释放资源 | public void close() | 释放资源 / 关闭流 |
// 创建FileWriter对象(关联文件+开启续写)
FileWriter fw = new FileWriter("myio\\a.txt", true);
// 定义字符数组
char[] chars = {'a','b','c','我'};
// 写出字符数组
fw.write(chars);
// 释放资源
fw.close();
1409

被折叠的 条评论
为什么被折叠?



