字符流
比如说使用字节流读取文本文件时,可能会有问题,中文字符时可能不会显示完整的字符,这是因为一个中文字符可能占用多个字节储存,所有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)); }