1、为什么学习字符流
- 有人要说了既然字节流既可以读又可以写,为什么还要学习字符流,这就要涉及到编码问题了,因为有的文件是英文的,有的文件是中文的,所以在用字节流去读取的时候遇到中文或者其他非英文的语言的时候,难免会出现乱码,所以要学习字符流。
2、字符流
2.1、字符输入流
Reader类 基类 — FileReader类是Reader的孙子类
- int read()
- int read(char[] c)
- int read(char[] c,int off,int len)
- void close()
FileReader类是Reader的孙子类
- FileReader(File file)
- FileReader(String name)
FileReader fr = new FileReader("d:/example/text.txt");
StringBuffer s = new StringBuffer();
char[] ch = new char[1024];
int len = -1;
while((len = fr.read(ch))!= -1){
s.append(ch);
}
System.out.print(s);
fr.close();
3、中文乱码问题
3.1、为什么会出现字符乱码
- 字符编码格式(GBK,GB2312,UTF-8):
- 文件编码格式不一致
- 程序环境的编码格式不一致
- 可以通过System.out.print(System.getProperty(“file.encoding”))获取本平台的编码方式
3.2、如何解决
- 3.2.1、手工解决,修改电脑或者平台上的编码格式
- 3.2.2、使用Reader的子类InputStreamReader
- InputStreamReader(InputStream in)
- InputStreamReaer(InputStream in ,String charsetName )
4、BufferedReader类
- 使用BufferedReader类可以提高读取文本的效率
- BufferedReader类是Reader类的子类
- BufferedReader类带有缓冲区
- 按行读取内容的readLine()方法
4.1、BufferedReader常用的构造方法
- BufferedReader(Reader in)
- 子类BufferedReader特有的方法
- readLine()
FileInputStream fis = new FileInputStream("c:\\example\\hello.txt");
InputStreamReader fr = new InputStreamReader(fis,"GBK");
BufferedReader br = new BufferedReader(fr);
String s = null;
while((s = br.readLine())!=null){
System.out.print(s);
}
br.close();
fr.close();
fis.close();
5、字符输出流
5.1、writer
- write(String str)
- write(String str, int of ,int len)
- void close()
- void flush()
5.2、FileWriter类是Writer的孙子类
- FileWriter(File file)
- FileWriter(String name)
- 带boolean类型的参数构造方法
6、BufferedWriter类
- BufferedWriter类是Writer类的子类
- BufferedWriter类带有缓冲区
- BufferedWriter常用的构造方法
- BufferedWriter(Writer out)