Java IO流(六)(字符流FileReader和FileWriter)
- 字符流
字符流的底层其实就是字节流
字符流=字节流+字符集
特点
输入流:一次读一个字节,遇到中文时,一次读多个字节
使用场景
对于纯文本文件进行读写操作
- FileReader类
①创建字符输入流对象
构造方法 | 说明 |
public FileReader(File file) | 创建字符输入流关联本地文件 |
public FileReader(String pathname) | 创建字符输入流关联本地文件 |
如果文件不存在,则直接报错。
②读取数据
成员方法 | 说明 |
public int read() | 读取数据,读到末尾返回-1 |
public int read(char[] buffer) | 读取多个数据,读到末尾返回-1 |
细节1:按字节进行读取。遇到中文,一次读多个字节,读取后解码,返回一个整数。
细节2:读到文件末尾了,read方法返回-1。
③释放资源
成员方法 | 说明 |
public int close() | 释放资源/关流 |
一次读取一个字符:
import java.io.FileReader;
import java.io.IOException;
public class FileReadDemo1 {
????public static void main(String[] args) throws IOException {
????????// 文件
????????FileReader fr = new FileReader("text/a.txt");
????????// read()细节:
????????// 1.read():默认也是一个字节一个字节的读取的,如果遇到中文就会一次读取多个
????????// 2.在读取之后,方法的底层还会进行解码并转成十进制。
????????// 最终把这个十进制作为返回值
????????// 这个十进制的数据也表示在字符集上的数字
????????// 英文:文件里面二进制数据01100001
????????// ?????read方法进行读取,解码并转成十进制97
????????// 中文:文件里面的二进制数据111001101011000110001001
????????// ?????read方法进行读取,解码并转成十进制27721
????????// 我想看到中文汉字,就是把这些十进制数据,再进行强转就可以了
????????// 缓存区,一次读取10个字符
????????char[] buffer = new char[20];
????????// 循环读取
????????for (int r = fr.read(buffer); r != -1; r = fr.read(buffer)){
????????????System.out.print(new String(buffer, 0, r));
????????}
????????// 关闭资源
????????fr.close();
????}
}
读取到缓冲数组中:
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class FileReadDemo2 {
????public static void main(String[] args) throws IOException {
????????// 文件
????????FileReader fr = new FileReader("text/a.txt", StandardCharsets.UTF_8);
????????// read(chars):读取数据,解码,强转三步合并了,
????????// 把强转之后的字符放到数组当中
????????// 空参的read +强转类型转换
????????for (int r = fr.read(); r != -1; r = fr.read()){
????????????System.out.println((char) r);
????????}
????????// 关闭资源
????????fr.close();
????}
}
- FileWriter类
- 构造方法
构造方法 | 说明 |
public Filewriter(File file) | 创建字符输出流关联本地文件 |
public Filewriter(String pathname) | 创建字符输出流关联本地文件 |
public Filewriter(File file,boolean append) | 创建字符输出流关联本地文件,续写 |
public Filewriter(String pathname, boolean append) | 创建字符输出流关联本地文件,续写 |
- 成员方法
成员方法 | 说明 |
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) | 写出字符数组的一部分 |
- FileWriter书写细节
①创建字符输出流对象
细节1:参数是字符串表示的路径或者File对象都是可以的
细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
细节3:如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关
②写数据
细节:如果write方法的参数是整数,但是实际上写到本地文件中的是整数在字符集上对应的字符
③释放资源
细节:每次使用完流之后都要释放资源
import java.io.FileWriter;
import java.io.IOException;
public class WriterDemo1 {
????public static void main(String[] args) throws IOException {
????????/* 字节流输出方式
????????// 1 文件输出流
????????FileOutputStream fos = new FileOutputStream("text/b.txt", true);
????????// 2 获取数组
????????byte[] bytes = "\n续写内容".getBytes();
????????fos.write(bytes);
????????// 3 关闭资源
????????fos.close();
?????????*/
????????// 1.创建文件写出对象
????????FileWriter fw = new FileWriter("text/b.txt", true);
????????// 2.写出字符
????????//fw.write(97); ??// 输出一个字符a
????????//fw.write("\nFileWriter续写的内容"); ???// 输出字符串
????????fw.write("\nFileWriter续写的内容", 0, 11); ??// 输出部分String内容
????????// 3.续写内容
????????fw.close();
????}
}
- 字符流原理解析
- 字符输入流原理
①创建字符输入流对象
底层:关联文件,并创建缓冲区(长度为8192的字节数组)
②读取数据
底层:
1.判断缓冲区中是否有数据可以读取
2.缓冲区没有数据:就从文件中获取数据,装到缓冲区中,每次尽可能装满缓冲区如果文件中也没有数据了,返回-1
3.缓冲区有数据:就从缓冲区中读取。
- 空参的read方法:一次读取一个字节,遇到中文一次读多个字节,把字节解码并转成十进制返回
- 有参的read方法:把读取字节,解码,强转三步合并了,强转之后的字符放到数组中
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CharStreamDemo1 {
????public static void main(String[] args) throws IOException {
????????// 读取器
????????FileReader fr = new FileReader("files\\a.txt");
????????fr.read();
????????// 写出器
????????// 本Writer会清空文件的内容
????????FileWriter fw = new FileWriter("files\\a.txt");
????????// 这里使用fr进行读取
????????// 是否还会取到数据?
????????// 答案是可以,因为缓冲区中有8192字节的数据。
????????// 当缓冲区中数据读取完毕后,无法再读取文件中的内容了。
????????int ch;
????????while ((ch = fr.read()) != -1){
????????????System.out.println((char) ch);
????????}
????????// 关闭资源
????????fr.close();
????????fw.close();
????}
}
- 字符输出流原理
字符输出流也会创建一个8192字节的缓冲区,输出数据先是往缓冲区内写入数据,有3种情况下会将缓冲区中的数据输出到文件中:
- 缓冲区满
- 调用flush方法
- 调用close方法关闭流时
- flush和close方法
成员方法 | 说明 |
public void flush() | 将缓冲区中的数据,刷新到本地文件中 |
public void close() | 释放资源/关流 |
- flush刷新:刷新之后,还可以继续往文件中写出数据
- close关流:断开通道,无法再往文件中写出数据
- 字节流和字符流的使用场景
字节流
拷贝任意类型的文件
字符流
读取纯文本文件中的数据
往纯文本文件中写出数据
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!