1.开篇
承接博主上一篇博文的字节流,在这篇博文中,我主要为大家介绍一下I/O流中的字符流,有关字节流的内容可以参考下面博文的链接:👇👇👇
2.字符流概述
说明:除了字节流,JDK还提供了用于实现字符操作的字符流,同字节流一样,字符流也有两个抽象的顶级父类,分别是Reader 和 Writer。
3.字符流应用举例
3.1 FileReader
import java.io.*;
public class IODemo04 {
public static void main(String[] args) throws IOException {
//创建FileReader对象,构造方法中绑定要读取的数据源
FileReader fr1=new FileReader("E:/Eclipse/Java Project/Love/FOS1.txt");
int len1=0;
System.out.print("读取文件FOS1中的内容:");
while((len1=fr1.read())!=-1) {
System.out.print((char)len1 + " ");
}
fr1.close();//关闭流,释放资源
System.out.println();
FileReader fr2=new FileReader("E:/Eclipse/Java Project/Love/FOS2.txt");
char[] ch1=new char[20];
int len2=fr2.read(ch1);//将从输入流中读取的所有字符存入字符数组中
System.out.print("读取文件FOS2中的内容:");
for(int i=0;i<len2;i++) {//len2为字符数组的长度
System.out.print(ch1[i] + " ");
}
fr2.close();//关闭流,释放资源
System.out.println();
FileReader fr3=new FileReader("E:/Eclipse/Java Project/Love/FOS3.txt");
char[] ch2=new char[20];
int len3=fr3.read(ch2,1,4);//将从输入流中读取的从第1个字符开始(包括第1个)往后的4个字符存入字符数组中
System.out.print("读取文件FOS3中的内容:");
for(int i=1;i<=4;i++) {//1表示从第一个字符开始,4表示一共读取的字符个数
System.out.print(ch2[i] + " ");
}
fr3.close();//关闭流,释放资源
System.out.println();
}
}
3.2 FileWriter
import java.io.*;
public class IODemo05 {
public static void main(String[] args) throws IOException {
//创建FileWriter对象,构造方法中绑定要写入数据的目的地
FileWriter fw1=new FileWriter("study1.txt");
//使用FileWriter中的write()方法把数据写入到内存缓冲区中
fw1.write("Hello FileWriter!");
//使用FileWriter中的方法flush,把内存缓冲区中的数据刷新到文件中
fw1.flush();
//释放资源(会先把内存冲区中的数据刷新到文件中)
fw1.close();
FileWriter fw2=new FileWriter("study2.txt");
char[] ch1="编程路上的初学者".toCharArray();
fw2.write(ch1);
char[] ch2={97,98,99,100,101};
fw2.write(ch2,1,3);
fw2.flush();
fw2.close();
FileWriter fw3=new FileWriter("study3.txt",true);//续写和换行
fw3.write("软件设计师");
fw3.write("\n");
fw3.write("Java工程师");
fw3.flush();
fw3.close();
}
}
3.3 I/O异常的处理
在之前的程序代码块中,我们都是通过 throws IOException 来将异常抛出。那么,下面我们对I/O异常进行处理:
import java.io.*;
public class IODemo06 {
public static void main(String[] args) {
FileWriter fw=null;//创建FileWriter并赋值Null
try {
fw=new FileWriter("study4.txt",true);//可以续写和换行
fw.write("IO流中的字节流");//写入数据
fw.write("\n");
fw.write("IO流中的字符流");
fw.flush();
}catch (IOException e1) {
System.out.println(e1.getMessage());//处理异常
}finally {//无论如何,都会执行finally语句块
try {
assert fw!=null;//当且仅当fw!=null的时候
fw.close();
}catch (IOException e2) {
e2.getMessage();//处理异常
}
}
}
}
在JDK7后,可以直接在try后创建流对象,而不用写finally语句块,最后也会释放资源(自动释放资源),如下:👇👇👇
import java.io.*;
public class IODemo07 {
public static void main(String[] args) {
try (//可以直接在try语句中创建流对象,自动释放资源
FileInputStream fis=new FileInputStream("E:/Eclipse/Java Project/Love/集合.jpg");
FileOutputStream fos=new FileOutputStream("E:/Eclipse/Java Project/Love/集合5.jpg");
) {
int len=0;
while((len=fis.read())!=-1) {
fos.write(len);//写入数据,拷贝图片
}
}catch(IOException e) {
System.out.println(e.getMessage());//处理异常
}
}
}
3.4 字符缓冲流
说明:使用字符流逐个字符的读写文件也需要频繁的操作文件,效率仍非常低。为此,同字节流操作文件一样,也可以使用提供的字符流缓冲区(类似于字节流缓冲区)和字符缓冲流(类似于字节缓冲流)进行读写操作,来提高执行效率。
使用:①字符流缓冲区需要定义一个字符数组作为字符缓冲区,通过操作字符缓冲区来提高文件读写效率。
②字符缓冲流需要使用 BufferedReader 和 BufferedWriter,其中 BufferedReader 用于对字符输入流进行操作,BufferedWriter 用于对字符输出流进行操作。在 BufferedReader 中有一个 readLine() 方法,用于一次读取一行文本。
import java.io.*;
public class IODemo08 {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("E:/Eclipse/Java Project/Love/FOS1.txt");
FileWriter fw=new FileWriter("E:/Eclipse/Java Project/Love/FOS11.txt");
int len=0;
char[] buff1=new char[1024];
while((len=fr.read(buff1))!=-1) {
fw.write(buff1,0,len);
}
fr.close();
fw.close();
BufferedReader br=new BufferedReader(new FileReader("E:/Eclipse/Java Project/Love/FOS2.txt"));
BufferedWriter bw=new BufferedWriter(new FileWriter("E:/Eclipse/Java Project/Love/FOS22.txt"));
String str=null;
while((str=br.readLine())!=null) {
bw.write(str);
bw.newLine();
}
br.close();
bw.close();
}
}