
❤️ 个人主页:水滴技术
🚀 支持水滴:点赞👍 + 收藏⭐ + 留言💬
🌸 订阅专栏:Java 教程:从入门到精通
大家好,我是水滴~~
本篇文章主要讲述“文件字符输入流”和“文件字符输出流”两个类的使用,并列举了一些读写案例,帮助学习。
- 文件字符输入流(FileReader)用于读取文本文件内容。将磁盘中文本文件的数据,读取到内存中使用。
- 文件字符输出流(FileWriter)用于向文本文件写入内容。将内存中的数据,写入到磁盘文本文件中。

FileReader(文件字符输入流)
FileReader 是文件字符输入流,用于读取文本文件。该类的父类为 InputStreamReader,它是字节流和字符流的桥梁,它读取字节流并使用指定的字符集解码为字符。InputStreamReader 的父类便是字符输入流 Reader 了。
构造函数
FileReader 类有三个构造函数,它们使用默认的字符集来读取文本文件。如果想要指定字符集,需要借助其父类 InputStreamReader。
FileReader(String fileName)
通过文件路径名,创建文件字符输入流
FileReader实例。
FileReader(File file)
通过文件
File实例,创建文件字符输入流FileReader实例。
FileReader(FileDescriptor fd)
通过文件描述符
FileDescriptor实例,创建文件字符输入流FileReader实例。
常用方法
int read()
从流中读取一个字符。该方法会阻塞,直到字符可用、发生 I/O 异常或达到流的结尾。
返回值:该方法将读取的内容以 0 至 65535(0x00 - 0xffff) 范围内的整数返回,如果到达流的末尾,则为 -1。
int read(char cbuf[])
从流中读取多个字符,并存入缓冲区数组
cbuf中。该方法会阻塞,直到字符可用、发生 I/O 异常或达到流的结尾。
返回值:读取的字符数。如果已经到达流的结尾,则为 -1。
int read(char cbuf[], int off, int len)
从流中读取多个字符,并存入缓冲区数组
cbuf一部分,从缓冲区的off下标处开始存储,最多存入len个字符。
返回值:读取的字符数。如果已经到达流的结尾,则为 -1。
void close()
关闭该输入流,并释放与之相关的所有系统资源。
读取文件的案例
案例一:每次读取一个字符
磁盘中有一个文件
c:/io/06_UTF8.txt,其内容为:水滴技术
代码示例:
public static void reader1() throws IOException {
// 通过文件路径名,创建一个 FileReader 实例
FileReader fr = new FileReader("c:/io/06_UTF8.txt");
// 读取一个字符
System.out.println(fr.read());
// 读取一个字符
System.out.println(fr.read());
// 读取一个字符
System.out.println(fr.read());
// 读取一个字符
System.out.println(fr.read());
// 读取一个字符
System.out.println(fr.read());
// 关闭流并释放资源
fr.close();
}
输出内容:
27700
28404
25216
26415
-1
案例二:循环读取,每次读取一个字符
磁盘中有一个文件
c:/io/06_UTF8.txt,其内容为:水滴技术
代码示例:
public static void reader2() throws IOException {
// 通过文件路径名,创建一个 FileReader 实例
FileReader fr = new FileReader("c:/io/06_UTF8.txt");
// 读取的文件内容
int read;
// 循环读取文件内容
while ((read = fr.read()) != -1) {
// 将读取的文件内容转为 char
System.out.println((char) read);
}
// 关闭流并释放资源
fr.close();
}
输出内容:
水
滴
技
术
案例三:使用字符数组,每次读取多个字符
磁盘中有一个文件
c:/io/07_UTF8.txt,其内容为:水滴技术YYDS
代码示例:
public static void reader3() throws IOException {
// 通过文件路径名,创建一个 FileReader 实例
FileReader fr = new FileReader("c:/io/07_UTF8.txt");
// 存储读取的内容
char[] chars = new char[5];
// 读取字符的长度
int len;
// 循环读取内容
while ((len = fr.read(chars)) != -1) {
// 将字符数组转为字符串
System.out.println(new String(chars, 0, len));
}
// 关闭流并释放资源
fr.close();
}
输出内容:
水滴技术Y
YDS
案例四:使用 InputStreamReader 类读取文件,文件字符集为 GBK
磁盘中有一个文件
c:/io/10_GBK.txt,其内容为:水滴技术YYDS,其字符集为:GBK
代码示例:
public static void reader4() throws IOException {
// 创建一个 InputStreamReader 实例,并指定字符集
InputStreamReader fsr = new InputStreamReader(new FileInputStream("c:/io/10_GBK.txt"), "GBK");
// 存储读取的内容
char[] chars = new char[5];
// 读取字符的长度
int len;
// 循环读取内容
while ((len = fsr.read(chars)) != -1) {
// 将字符数组转为字符串
System.out.println(new String(chars, 0, len));
}
// 关闭流并释放资源
fsr.close();
}
输出内容:
水滴技术Y
YDS
FileWriter(文件字符输出流)
FileWriter 是文件字符输出流,用于向文本文件写入内容。该类的父类为 InputStreamWriter,它是字符流和字节流的桥梁,将字符通过指定的字符集编码成字节,再进行写入。InputStreamWriter的父类便是字符输出流 Writer 了。
构造函数
FileWriter 类有五个构造函数,它们使用默认的字符集来向文本文件写入内容。如果想要指定字符集,需要借助其父类 InputStreamWriter。
FileWriter(String fileName)
通过文件路径名,创建文件字符输出流
FileWriter实例。
FileWriter(String fileName, boolean append)
通过文件路径名创建文件字符输出流。
append为true时表示从原数据末尾追加,否则会覆盖原数据。
FileWriter(File file)
通过文件
File实例,创建文件字符输出流FileWriter实例。
FileWriter(File file, boolean append)
通过文件
File实例,创建文件字符输出流FileWriter实例。append为true时表示从原数据末尾追加,否则会覆盖原数据。
FileWriter(FileDescriptor fd)
通过文件描述符
FileDescriptor实例,创建文件字符输出流FileWriter实例。
常用方法
void write(int c)
向输出流写入一个字符。
void write(char cbuf[])
向输出流写入一个字符数组。
void write(char cbuf[], int off, int len)
向输出流写入数组的一部分。从数组
cbuf的下标off处开始,最多写入len个字符。
void write(String str)
向输出流写入一个字符串。
void write(String str, int off, int len)
向输出流写入字符串的一部分。
void flush()
刷新该输出流,强制将缓存区中的字符写出去。
void close()
关闭该输出流,并释放与之相关的所有系统资源。
写入文件的案例
案例一:一次写入一个字符
代码示例:
public static void writer1() throws IOException {
// 通过文件路径创建 FileWriter 实例,默认使用 UTF8 字符集
FileWriter fw = new FileWriter("c:/io/05_UTF8.txt");
// 写入一个字符
fw.write(27700); // 水(UTF-8)
// 写入一个字符
fw.write(28404); // 滴(UTF-8)
// 写入一个字符
fw.write(25216); // 技(UTF-8)
// 写入一个字符
fw.write(26415); // 术(UTF-8)
// 关闭流并释放资源
fw.close();
}
会创建一个 c:/io/05_UTF8.txt 文件,文件内容为:水滴技术
案例二:通过字符数组,一次写入多个字符
代码示例:
public static void writer2() throws IOException {
// 通过文件路径创建 FileWriter 实例
FileWriter fw = new FileWriter("c:/io/06_UTF8.txt");
// 字符数组
char[] chars = {
'水', '滴', '技', '术'};
// 将字符数组写入流
fw.write(chars);
// 关闭流并释放资源
fw.close();
}
会创建一个 c:/io/06_UTF8.txt 文件,文件内容为:水滴技术
案例三:通过字符数组偏移量,一次写入多个字符
代码示例:
public static void writer3() throws IOException {
// 通过文件路径创建 FileWriter 实例
FileWriter fw = new FileWriter("c:/io/07_UTF8.txt");
// 字符数组
char[] chars = {
'1', '2', '3', '水', '滴', '技', '术', 'Y', 'Y', 'D', 'S'};
// 将字符数组的一部分写入流
fw.write(chars, 3, chars.length - 3);
// 关闭流并释放资源
fw.close();
}
会创建一个 c:/io/07_UTF8.txt 文件,文件内容为:水滴技术YYDS
案例四:通过字符串,一次写入多个字符
代码示例:
public static void writer4() throws IOException {
// 通过文件路径创建 FileWriter 实例
FileWriter fw = new FileWriter("c:/io/08_UTF8.txt");
// 将字符串写入流
fw.write("水滴技术");
// 关闭流并释放资源
fw.close();
}
会创建一个 c:/io/08_UTF8.txt 文件,文件内容为:水滴技术
案例五:通过字符串偏移量,一次写入多个字符
代码示例:
public static void writer5() throws IOException {
// 通过文件路径创建 FileWriter 实例
FileWriter fw = new FileWriter("c:/io/09_UTF8.txt");
String str = "123水滴技术YYDS";
// 将字符串写入流
fw.write(str, 3, str.length() - 3);
// 关闭流并释放资源
fw.close();
}
会创建一个 c:/io/09_UTF8.txt 文件,文件内容为:水滴技术YYDS
案例六:通过父类 OutputStreamWriter 写入 GBK 字符集数据
代码示例:
public static void writer6() throws IOException {
// 创建一个 OutputStreamWriter 实例,并指定字符集
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("c:/io/10_GBK.txt"), Charset.forName("GBK"));
String str = "123水滴技术YYDS";
// 将字符串写入流
osw.write(str, 3, str.length() - 3);
// 关闭流并释放资源
osw.close();
}
会创建一个 c:/io/10_GBK.txt 文件,文件内容为:水滴技术YYDS,文件字符集为:GBK
