Java字符流(FileReader/FileWriter)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
文章目录
概念
在Java中使用Unicode约定存储字符。字符流自动允许我们逐字符读/写数据有助于执行16位Unicode的输入和输出它是以reader和writer结尾的。在内部FileReader使用FileInputStream同样FileWrite使用FileOutputStream字符流采用Unicode编码。
如果对输入流和输出流有疑问可查看此博客或自行百度
Java IO流基础详解快速上手
如有疑问欢迎评论区留言私信。
FileReader字符输入流
Reader 字符输入流用于读取字符流的抽象超类。
FileReader类从InputStreamReader类继承而来。和文件相关的字符输入流可用于读取文件数据。创建对象的时候如果指定的文件不存在将抛出异常。
相关方法和构造器
FileReader提供了三个构造器用于实例化FileReader对象根据不同的场景进行选择
-
read()每次读取单个字符返回该字符如果到文件末尾返回-1
public int read();
-
read(char[])批量读取多个字符到数组返回读取到的字符数如果到文件末尾返回-1
public int read(char[] cbuf);
演示示例
使用FileReader从E盘下的hello.txt文本读取内容并显示
- read()单个字符读取文件返回实际读取到的字符数
import org.junit.jupiter.api.Test;
import java.io.FileReader;
import java.io.IOException;
@Test
public void readFile01(){
String filePath = "E:\\test.txt";
FileReader fileReader = null;//创建FileReader对象
int data;
try {
fileReader= new FileReader(filePath);
//循环读取
while ((data = fileReader.read())!=-1){
System.out.print((char) data);
}
} catch (IOException e) {
e.getMessage();
}finally {
if (fileReader!=null){
try {
fileReader.close();//释放内存
} catch (IOException e) {
e.getMessage();
}
}
}
}
- read(Char[] cbuf) 使用字符数组读取文件
这里使用了String的构造器用于将buf转换为字符串
@Test
public void readFile02() {
String filePath = "E:\\test.txt";
FileReader fileReader = null;//创建FileReader对象
int readLen = 0;
char[] buf = new char[8];
try {
fileReader = new FileReader(filePath);
//
while ((readLen = fileReader.read(buf)) != -1) {
System.out.print(new String(buf, 0, readLen));
}
} catch (IOException e) {
e.getMessage();
} finally {
if (fileReader != null) {
try {
fileReader.close();//释放内存
} catch (IOException e) {
e.getMessage();
}
}
}
}
执行完毕之后会读取到文本中相应的内容
FileWriter字符输出流
FileWriter 类从 OutputStreamWriter 类继承而来。该类按字符向流中写入数据。与FileOutputStream基本类似只是前者是基于字符流后者是基于字节流。
相关方法和构造器
FileWriter提供了五个构造器用于实例化FileWriter对象根据不同的场景进行选择
FileWriter(File file, boolean append)
此构造器为追加模式当append为true时追加到文件的末尾否则覆盖public void write(int c);
写入单个字符public void write(char[] cbuf);
写入指定数组public void write(char[] cbuf, int off, int len);
写入指定数组指定的部分public void write(String str);
写入整个字符串public void write(String str, int off, int len);
写入字符串的指定部分
注意FileWriter使用后必须关闭close或刷新flush否则写入不到指定的文件还在内存里面
演示示例使用的是追加构造器
将文本内容输出到E盘的test.txt文件
这里使用了Stirng类中的toCharArray方法将字符串转换成字符数组
import org.junit.jupiter.api.Test;
import java.io.FileWriter;
import java.io.IOException;
@Test
public void WriteFile02() {
String filePath = "E:\\test.txt";//操作的文件路径
//创建FileWrite对象
FileWriter fileWriter = null;
char[] chars = {'a', 'b', 'c'};
try {
fileWriter = new FileWriter(filePath, true);
fileWriter.write('a');//写入单个字符
fileWriter.write(chars);//写入指定数组
fileWriter.write("hello,world".toCharArray(), 0, 5); //写入字符数组的指定部分 写入hello
fileWriter.write("Java");//写入整个字符串
fileWriter.write("你好世界",0,2);//写入字符串的指定部分
} catch (IOException e) {
e.getMessage();//输出异常l
} finally {
try {
fileWriter.close();//释放资源
} catch (IOException e) {
e.getMessage();
}
}
}
此时上述代码执行之后test.txt的内容变成aabchelloJava你好
在数据量大的情况下可以使用循环操作
为什么用完不close或flush会写入不到数据
当我们在close方法处进行断点进行调试的时候会发现FileWriter真正写入数据的时候是在close方法中
一直下一步真正添加数据是在这里
flush刷新方法同理也会追加到这里