在用InputStream对文件进行读取的时候,如果文件中有中文字符,那么久会出现乱码。
通过FileInputStream中的read方法进行读取,一次是读一个字节的,而我们的一个中文字符一个是占两个字节的,FileInputStream在自己的码表中查询不到响应的信息,所以会造成乱码。此时,我们就需要用到字符流。
字符流就是:字节流+编码表(本地默认编码gbk)。
Reader
Reader和InputStream的用法类似,Reader是一个抽象基类,通过其派生类FileReader对其进行操作。
package demo;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
publicclass io {
publicstaticvoid main(String[] args) throws IOException {
test3();
}
privatestaticvoid test3() throws IOException {
FileReader fr=new FileReader("c:\\test.txt");
int len=0;
while((len=fr.read())!=-1)
{
System.out.println((char)len);
}
fr.close();
}
Writer
Writer和OutPutStream用法类似。
package demo;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Arrays;
publicclass io {
publicstaticvoid main(String[] args) throws IOException {
test4();
}
privatestaticvoid test4() throws IOException
{
Writer writer=new FileWriter("c:\\test2.txt",true);
writer.write('哈');
writer.write("哈哈".toCharArray());
writer.write("哈哈");
writer.close();
}
}
字符流的缓冲
Reader有一个子类BufferedReader,在BufferedReader中有一个方法readLine()方法具有一次读取一个文本行的功能。
package demo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.util.Arrays;
publicclass io {
publicstaticvoid main(String[] args) throws IOException {
test5();
}
privatestaticvoid test5() throws IOException
{
//创建字符输入流
Reader reader=new FileReader("c:\\test1.txt");
//创建字符输入流的缓冲流
BufferedReader br=new BufferedReader(reader);
//创建字符输出流
Writer writer=new FileWriter("c:\\test2.txt");
//创建字符输出流的缓冲流
BufferedWriter bw=new BufferedWriter(writer);
String line=null;
//一次读取一行
while((line=br.readLine())!=null)
{
//一次写出一行
bw.write(line);
//进行换行
bw.newLine();
}
//关闭流
bw.close();
br.close();
}
}