1.字符流:在字节流的基础上添加了编码机制。很大程度上和字节流操作一样的,字符流只能操作文本类文件,准确的说应该是纯文本类文件。例如.txt,.java,.cpp,.html等
编码:每一个国家都有自己的编码,编码不一致往往导致的结果就是!!乱码!!。中国编码的编码:gbk
gbk:英文字母:1个字节,中文:2个字节,系统的默认编码。
unicode:统一编码。中文还是英文字母都是占2个字节。
utf-8: 国际编码。英文占1个字节,中文占3个字节。
文件是用什么编码来写的,那么就用什么编码来读取。最常用的编码是gbk和utf-8.一般的情况下,都设置为utf-8.(还有其他的很多编码:例如GB2312,big5等等)。如果想测试是否像上面所说那么多个字节的话,建议使用Notepad2文本软件,体积小功能强!(似乎再买广告了。。。)
Reader:读取数据
FileReader:文件读取字符流
BufferedReader://带缓冲区的字符输入流
readLine() ;读取一行数据
LineNumberReader;带行号.通过getLineNumber()方法获取行号
1 import java.io.FileReader; 2 import java.io.IOException; 3 import java.io.LineNumberReader; 4 5 /*LineNumberReader是BufferedReader的子类, 6 * 比BufferedReader多了设置行号和获取行号的功能。 7 * 使用LineNumberReader流读取文本文件,并打印在控制台上。 8 * 在每行的前面添加行号。 9 */ 10 11 public class LineNumberReaderDemo1 { 12 public static void main(String[] args) throws IOException { 13 LineNumberReader lnr = new LineNumberReader(new FileReader("e:\io.txt")); 14 String str = null; 15 while((str = lnr.readLine()) != null){ 16 // lnr.setLineNumber(90);//设置行号 17 System.out.print(lnr.getLineNumber()+" : "); 18 System.out.println(str); 19 } 20 lnr.close(); 21 } 22 }
Writer:写入数据
FileWrite:写入数据,记得刷新。
BufferedWriter://带缓冲区的字符输出流
newLine():写入换行字符。
write(String str):写入字符串。
/* * 2:用字符流复制文本文件。 */ public static boolean copyText(String textPath, String targetPath){ boolean flag = false; if(textPath==null || textPath.trim().equals("")){ return flag; } if(targetPath == null || targetPath.trim().equals("")){ int end = textPath.lastIndexOf("."); String endStr = textPath.substring(end);//后缀名 int index = textPath.lastIndexOf("\"); if(index == 0){ index = textPath.lastIndexOf("/"); } targetPath = textPath.substring(0,end)+"2"+endStr;//新文件名 } BufferedReader br = null; BufferedWriter bw = null; try { //字符输入流 FileReader fr = new FileReader(textPath); br = new BufferedReader(fr); //字符输出流 FileWriter fw = new FileWriter(targetPath); bw = new BufferedWriter(fw); String str = ""; while((str=br.readLine()) != null){ bw.write(str); bw.newLine(); bw.flush(); } flag = true; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ try{ bw.close(); br.close(); }catch (IOException e){ e.printStackTrace(); } } return flag; }
转换流:可带编码格式的流
InputStreamReader;字节转换为字符流
public class SystemReadDemo1 { public static void main(String[] args) throws IOException { //获取键盘输入 InputStream is = System.in; //将字节流转换为字符流,用到InputStreamReader(InputStream in)---转换流 InputStreamReader isr = new InputStreamReader(is,"utf-8"); //将字符流再转为带缓冲区的字符流 BufferedReader br = new BufferedReader(isr); String str = null; while(true){ str = br.readLine(); if("886".equals(str)){ break; } System.out.println(str); } br.close(); } }
OutputStreamWriter ;字符流转换为字节流。
package com.java.homework; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; /* * 1:获取键盘录入的数据,将数据写到文件中,但是以utf-8编码的形式写到文件中去。 */ public class HomeWork1 { public static void main(String[] args) { BufferedReader br = null; BufferedWriter bw = null; try { br = new BufferedReader(new InputStreamReader(System.in)); bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("e:\aa.txt"), "utf-8")); String str = ""; while(true){ str = br.readLine(); if("exit".equals(str)){ //可以尝试不同的编码 OutputStreamWriter osw = new OutputStreamWriter(System.out, "GBK"); BufferedWriter bw2 = new BufferedWriter(osw); bw2.write("输入结束!"); bw2.flush(); break; } bw.write(str); bw.newLine(); bw.flush(); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ try { bw.close(); br.close(); } catch (IOException e) { e.printStackTrace(); } } } }