五字符流的使用
(1)编码问题
这个问题我们早就说过了,不再过多赘述。
参考:JavaSE入门学习42:文件传输基础之I/O流(一)
(2)认识文本和文本文件
Java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码);而文件是byte byte byte ...的数据
;文本文件是文本(char)序列按照某种编码方案(utf-8,utf-16be,gbk等)序列化为byte的存储结果。
(3)字符流(Reader Writer)---->操作的是文本文本文件
字符的处理,一次处理一个字符。
字符的底层任然是基本的字节序列。
(4)字符流的基本实现
1)InputStreamReader类和OutputStreamWriter类
InputStreamReader类是完成byte流解析为char流,按照编码解析。
InputStreamReader类的方法:
OutputStreamWriter类是提供char流到byte流,按照编码处理。
OutputStreamWriter类的方法:
实例代码:
import java.io.*; public class IsrAndOswDemo{ public static void main(String[] args) throws IOException { FileInputStream in = new FileInputStream("E:\\Java\\JavaSE\\IO\\testutf8.txt"); InputStreamReader isr = new InputStreamReader(in);//默认项目的编码,操作的时候,要写文件本身的格式 //InputStreamReader isr = new InputStreamReader(in,"gbk"); FileOutputStream out = new FileOutputStream("E:\\Java\\JavaSE\\IO\\testutf81.txt"); OutputStreamWriter osw = new OutputStreamWriter(out); //int c; //while((c = isr.read())!=-1){ // System.out.print((char)c); //} char[] buffer = new char[8*1024]; int b; /* *批量读取,放入buffer这个字符数组,从第0个位置开始放置,最多放buffer.length个 *返回的是读到的字符的个数 */ while(( b = isr.read(buffer,0,buffer.length))!=-1){ String s = new String(buffer,0,b); System.out.print(s); osw.write(buffer,0,b); osw.flush(); } isr.close(); osw.close(); } }
运行结果:
2)FileReader类和FileWriter类
FileReader类用来读取字符文件的便捷类。
FileWriter类用来写入字符文件的便捷类。
FileReader类和FileWriter类中的方法都是来自继承的方法,并没有自己独有的方法。
实例代码:
import java.io.*; public class FrAndFwDemo { public static void main(String[] args) throws IOException{ //采用的是默认编码格式,这里并不能指定编码格式 FileReader fr = new FileReader("E:\\Java\\JavaSE\\IO\\test.txt"); FileWriter fw = new FileWriter("E:\\Java\\JavaSE\\IO\\test2.txt"); //继续在后面追加内容 //FileWriter fw = new FileWriter("E:\\Java\\JavaSE\\IO\\test2.txt",true); char[] buffer = new char[2056]; int c ; while((c = fr.read(buffer,0,buffer.length))!=-1){ fw.write(buffer,0,c); fw.flush(); } fr.close(); fw.close(); } }
运行结果:
(5)字符流的过滤器
BufferedReader类---->readLine 一次读一行
BufferedReader类从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。可以指定缓
冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
BufferedWriter/PrintWriter类---->写一行
BufferedWriter类将文本写入字符输出流,缓冲各个字符,从而实现字符、数组和行的高效读取。
PrintWriter类向文本输出流打印对象的格式化表示形式。
BufferedReader类的方法:
BufferedWriter类的方法:
PrintWriter类的方法:
实例:
import java.io.*; public class BrAndBwOrPwDemo { public static void main(String[] args) throws IOException{ //对文件进行读写操作 BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("E:\\Java\\JavaSE\\IO\\test.txt"))); //BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("E:\\Java\\JavaSE\\IO\\test3.txt"))); PrintWriter pw = new PrintWriter("E:\\Java\\JavaSE\\IO\\test4.txt"); //PrintWriter pw1 = new PrintWriter(outputStream,boolean autoFlush); String line ; while((line = br.readLine())!=null){ System.out.println(line);//一次读一行,并不能识别换行 //bw.write(line); //单独写出换行操作 //bw.newLine();//换行操作 //bw.flush(); pw.println(line); pw.flush(); } br.close(); //bw.close(); pw.close(); } }
运行结果: