为什么会出现字符流
-
字符流的介绍
由于字节流操作中文不是特别的方便,可能会出现乱码的情况,所以Java就提供字符流。
-
1.1 什么是字符流
字符流是可以直接读写字符的IO流
使用字符流从文件中读取字符时, 需要先读取到字节数据, 然后转为字符.
使用字符流往文件写入字符时, 需要把字符转为字节再写入文件.1.2 字符流有两大派
Reader和Writer,这两个类是抽象类,一般使用它们的子类
FileReader和FileWriteFileReader的使用
FileReader 用于读取字符,调用read方法的时候,是读取一个字符
read方法的返回值是int,它是把char 转成int
以后读纯文本文件,使用FileReader这个类
-
字符流
尽管Java中字节流的功能十分强大,几乎可以直接或间接地处理任何类型的输入/输出操作,但利用它却不能直接操作 16 位的 Unicode 字符。这就要用到字符流。其实字节流和字符流的方法大致一样,区别在于使用字节流时,每个文字或者是字母看作是一个字节,但是在字节流中,文字占三个字节。
字节流和字符流的其他区别:
字节流一般用来处理图像、视频、音频、PPT、Word等类型的文件。字符流一般用于处理纯文本类型的文件,如TXT文件等,但不能处理图像视频等非文本文件。用一句话说就是:字节流可以处理一切文件,而字符流只能处理纯文本文件。
字节流本身没有缓冲区,缓冲字节流相对于字节流,效率提升非常高。而字符流本身就带有缓冲区,缓冲字符流相对于字符流效率提升就不是那么大了。
字符流操作的对象是字符及字符数组,而字节流操作的对象则是字节及字节数组。
输入流——Reader
Reader 是Java的IO库提供的另一个输入流接口。 和 InputStream 的区别是, InputStream 是一个字节流,即以 byte 为单位读取,而 Reader 是一个字符流,即以 char 为单位读取
FileReader
Reader使用时需要用其子类FileReader类来创建对象
File f1 = new File("D:/a.txt");
Reader in = new FileReader(f1);
代码示例:
public static void main(String[] args) throws IOException {
File f1=new File("D:/a.txt");
//定义字符输入流:字节流汉字占三个,字符流中汉字占一个字符
Reader in=new FileReader(f1);
//每次读取缓冲区
char[] buffer=new char[8];
int n=in.read(buffer); //每次至多读取数组长度个字符,把读取到字符存入数组中,返回的是实际 读取的字符数
String s=new String(buffer,0,n); //截取数组,从第0个索引,截取读取有效字符数长度
System.out.println(s);
int n1=in.read(buffer);
String s1=new String(buffer ,0,n1);
System.out.println(s1);
//关闭资源
in.close();
}
运行结果:
输出流——Writer
Writer是Java的IO库提供的另一个输出流接口,和 OutputStream 的区别是, OutputStream 是一个字节流,即以 byte 为单位读取,而 Writer是一个字符流,即以 char 为单位读取
FileWriter的使用
FileWriter是Writer的子类,用来完成Writer对象的创建
//文件对象
File f1 = new File("D:/a.txt");
//创建Writer对象
Writer out = new FileWriter(f1);
代码示例:
package Test01;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class WriterTest09 {
public static void main(String[] args) throws IOException {
File f1=new File("D:/b.txt");
if (!f1.exists()){
f1.createNewFile();
}
//定义字符输出流
Writer out=new FileWriter(f1);
out.write(97);
out.write((int) '我');
char[] ch={'移','动','开','发'};
out.write(ch,0,4);
out.write("河南郑州");
out.flush(); //字符流必须刷新缓冲,才会真正写入磁盘文件中
out.close();
}
}
运行结果:
综合案例
对含有汉字的文件完成复制操作
package IO;
import java.io.*;
public class CopyTest03 {
public static void main(String[] args) throws IOException {
//创建复制和目标文件对象
File f1 = new File("D:/a.txt");
File f2 = new File("D:/b.txt");
//创建读对象
Reader in = new FileReader(f1);
//创建写对象
Writer out = new FileWriter(f2);
//缓冲区
char[] chars = new char[10];
//初始化
int n;
//读取数据
while ((n=in.read(chars)) !=-1){
//数据的写入
out.write(chars,0,n);
}
//资源释放
out.close();
in.close();
}
}
运行结果: