字符流:
文本和文本文件:
java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码)文件是byte byte byte....的数据序列,而文本文件是文本(char)序列按照某种编码方案(utf-8,utf-16be,gbk)序列化为byte的存储结果。
字符流(Reader Writer) ------> 操作的是文本文件;一次处理一个字符;字符的底层仍然是基本的字节序列
字符流的基本实现
InputStreamReader 完成byte流解析为char流,按照编码解析
OutputStreamWriter 提供char流到byte流,按照编码处理
public static void main(String[] args) throws IOException { // TODO Auto-generated method stub FileInputStream in = new FileInputStream("D:\\my\\studyWorkSpace\\java\\test.txt"); InputStreamReader isr = new InputStreamReader(in);//默认项目的编码,将来操作的时候,要写文件本身的编码格式 /* int c; while((c = isr.read()) != -1){ System.out.print((char)c); }*/ /* * 批量读取,放入buffer这个字符数组,从第0个位置开始放置,最多放buffer.length个 *返回的是读到的字符的个数 */ char[] buffer = new char[8 * 1024]; int len; while((len = isr.read(buffer,0,buffer.length)) != -1){ String s = new String(buffer,0,len); System.out.println(s); } }
心得:以字符为单位进行拷贝,和字节流用法差不多,主要是考虑编码格式。
FileReader,FileWriter
注意:FileReader读出的时候,按照项目默认编码读的,如果文件和项目默认编码不一致,那就只能用InputStreamReader来转码读取了。
public static void main(String[] args) throws IOException{ // TODO Auto-generated method stub FileReader fr = new FileReader("D:\\my\\studyWorkSpace\\java\\test.txt"); FileWriter fw = new FileWriter("D:\\my\\studyWorkSpace\\java\\test1.txt"); 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(); }
字节流的过滤器:
BufferedReader ---》readLine 一次读一行
BufferedWriter/PrintWriter ----》写一行
public static void main(String[] args) throws IOException{ //对文件进行读写操作 BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\my\\studyWorkSpace\\java\\test.txt"))); /*BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\my\\studyWorkSpace\\java\\test2.txt")));*/ PrintWriter pw = new PrintWriter("D:\\my\\studyWorkSpace\\java\\test3.txt"); 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(); }
行号追踪LineNumberReader
public static void main(String[] args)throws IOException { FileReader fr = new FileReader("D:\\my\\studyWorkSpace\\java\\test.txt"); PrintWriter pw = new PrintWriter("D:\\my\\studyWorkSpace\\java\\testlr.txt"); LineNumberReader lr = new LineNumberReader(fr); //每一行的字符串 String line = null; //当读到的内容不是空的时候 while((line = lr.readLine()) != null){ //每一行前面加上行号,并且换行输出 pw.println(lr.getLineNumber() + ":" + line); pw.flush(); } lr.close(); pw.close(); }