字符流
比如说使用字节流读取文本文件时,可能会有问题,中文字符时可能不会显示完整的字符,这是因为一个中文字符可能占用多个字节储存,所有Java提供一些字符流以字符为单位读写数据,专门用于处理文本文件。
字符输入流(读取)
1.public void close():关闭此流并释放与此流相关的任何系统资源
2.public int read():从输入流读取字符
3.public int read(char[ ] cbuf):从输入流中读取一些字符,并将它们存储到字符数组cbuf中
字符流写数据的5种方式
void write(int c) 写一个字符
void write(charl[] cbuf) 写入一个字符数组
void write(char[] cbuf, int off, int len) 写入字符数组的一部分
void write(String str) 写一个字符串
void write(String str, int off, int len) 写一个字符串的一部分
FileRerder类
是读取字符文件的便利类,构造时使用系统默认的字符编码和默认字节缓冲区
FileReader (File file) : 创建一个新的FileReader,给定要读取的File对象。
FileReader (String fileName) : 创建一个新的FileReader,给定要读取的文本的名称。
public static void main(String[] args) throws FileNotFoundException {
//使用file对象创建流对象
File file=new File("a.txt");
FileReader fileReader=new FileReader(file);
//使用文件名称创建流对象
FileReader fileReader1=new FileReader("b.txt");
}
读取字符---输入流
public static void main(String[] args) throws IOException {
//字符输入流Reader
File f1=new File("d:/a.txt");
//每次读取一个字符(中文占一个字符)
Reader in=new FileReader(f1);
//int n=in.read();//所有的中文符,每次读取一个字符,把该字符转换成对应编码值
// System.out.println((char)n);
//
// int n1=in.read();
// System.out.println((char)n1);
//使用缓冲区读取多个字符
char[] buffer=new char[10];
int n= in.read(buffer);//每次最多读取buffer数组个长度字符,把读取到的字符存入buffer数组中,返回的是实际读取到的字符串
System.out.println(n);
System.out.println(Arrays.toString(buffer));
char[] buffer1=new char[10];
int n1= in.read(buffer1);//每次最多读取buffer数组个长度字符,把读取到的字符存入buffer数组中,返回的是实际读取到的字符串
System.out.println(n1);
System.out.println(Arrays.toString(buffer1));
}
读取字符---输出流
public static void main(String[] args) throws IOException {
File f2=new File("D:/b.txt");
if (!f2.exists()){
f2.createNewFile();
}
//定义一个字符输出流,向f2文件写入内容
Writer out=new FileWriter(f2);
out.write(97);//转输出字符
out.write((int)'对');//强转数字输出
out.write("我是中国人!!!");//输出字符
char[] ch={'和','好','吧','!'};
out.write(ch);
out.flush();//刷新 字符输出流有缓冲区的概念,需要刷新缓冲区才能更新到硬盘
out.close();
}
缓冲流
缓冲流也叫高效流,按照数据类型分类:
字节缓冲流: BufferedInputStream(缓冲输入流) ,BufferedoutputStream(缓冲输出流)
字符缓冲流: BufferedReader,Bufferedhriter
缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数里,通过缓冲区读写,减少系统I0次数,从而提高读写的效率。
测试效率
public static void main(String[] args) throws IOException {
File f1=new File("D:/a.txt");
File f2=new File("D:/copy.txt");
BufferedReader br=new BufferedReader(new FileReader(f1));
BufferedWriter bw=new BufferedWriter(new FileWriter(f2));
long start=System.currentTimeMillis();
int n;
while((n=br.read())!=-1){
bw.write(n);
}
long stop=System.currentTimeMillis();
bw.flush();
br.close();
bw.close();
System.out.println("文件复制耗时"+(stop-start));
FileReader fr=new FileReader(f1);
FileWriter fw=new FileWriter(f2);
long start1=System.currentTimeMillis();
int m;
while((m=fr.read())!=-1){
fw.write(m);
}
long stop1=System.currentTimeMillis();
fw.flush();
fr.close();
fw.close();
System.out.println("字符流文件复制耗时"+(stop1-start1));
}