java —— 字符流

字符流的继承类图

  

  主要字符流,它们有:

    Reader/Writer:字符流的基类,它们是抽象类。

    InputStreamReader/OutputStreamWriter:适配器类,输入是InputStream,输出是OutputStream,将字节流转换为字符流。

    FileReader/FileWriter:输入源和输出目标是文件的字符流。

    CharArrayReader/CharArrayWriter: 输入源和输出目标是char数组的字符流。

    StringReader/StringWriter:输入源和输出目标是String的字符流。

    BufferedReader/BufferedWriter:装饰类,对输入输出流提供缓冲,以及按行读写功能。

    PrintWriter:装饰类,可将基本类型和对象转换为其字符串形式输出的类。

一、Reader/Writer

二、InputStreamReader/OutputStreamWriter   转换流

  可以使用指定的编码规范并基于字节流生成对应的字符流

 

  OutputStreamWriter的主要构造方法为:

 

    public OutputStreamWriter(OutputStream out)

 

    public OutputStreamWriter(OutputStream out, String charsetName)

 

    public OutputStreamWriter(OutputStream out, Charset cs)

 

  InputStreamReader的主要构造方法为:

 

    public InputStreamReader(InputStream in)

 

    public InputStreamReader(InputStream in, String charsetName)

 

    public InputStreamReader(InputStream in, Charset cs)

  重要的参数是编码类型,可以通过名字charsetName或Charset对象传入,默认编码 Charset.defaultCharset() 得到 GBK

 

 二、FileReader/FileWriter  字符流  

 

   是 InputStreamReader/OutputStreamWriter 的子类。

     FileReader 主要构造方法有:

 

    public FileReader(File file) throws FileNotFoundException

 

    public FileReader(String fileName) throws FileNotFoundException

 

  FileWriter 主要构造方法有:

 

    public FileWriter(File file) throws IOException

 

    public FileWriter(File file, boolean append) throws IOException

 

    public FileWriter(String fileName) throws IOException

 

    public FileWriter(String fileName, boolean append) throws IOException

  append参数指定是追加(true)还是覆盖 (false),默认覆盖

  备注:FileReader/FileWriter不能指定编码类型,只能使用默认编码,如果需要指定编码类型,可以使用InputStreamReader/OutputStreamWriter。

三、CharArrayReader/CharArrayWriter

  与字节流 ByteArrayInputStream/ByteArrayOutputStream 是类似的,将字节(byte)数组变为字符(char)数组

 

 

四、StringReader/StringWriter

 

  StringReader/StringWriter与CharArrayReader/CharArrayWriter类似,只是输入源为String,输出目标为StringBuffer,而且,String/StringBuffer内部是由char数组组成的,所以它们本质上是一样的。
  之所以要将char数组/String与Reader/Writer进行转换也是为了能够方便的参与Reader/Writer构成的协作体系,复用代码。

五、BufferedReader/BufferedWriter

  BufferedReader/BufferedWriter是装饰类,提供缓冲,以及按行读写功能。BufferedWriter的构造方法有:

    public BufferedWriter(Writer out)

    public BufferedWriter(Writer out, int sz)

  参数sz是缓冲大小,如果没有提供,默认为8192。它有如下方法,可以输出平台特定的换行符

    public void newLine() throws IOException

 

  BufferedReader的构造方法有:

    public BufferedReader(Reader in)

    public BufferedReader(Reader in, int sz)

参数sz是缓冲大小,如果没有提供,默认为8192。它有如下方法,可以读入一行:

    public String readLine() throws IOException

 备注:

  字符'\r'或'\n'或'\r\n'被视为换行符,readLine返回一行内容,但不会包含换行符,当读到流结尾时,返回null。

  FileReader/FileWriter是没有缓冲的,也不能按行读写,所以,一般应该在它们的外面包上对应的缓冲类。

  使用字符缓冲流读取一行文件

1         BufferedReader read = new BufferedReader(new FileReader("D:\\mys\\utf-8.txt"));
2         String str = read.readLine();
3         System.out.println(str);
4         read.close();

  输出结果的这一行文字乱码了,这是因为 该文本文件是用 utf-8 的格式保存的,而 eclipse 默认的编码格式是 GBK 。

   FileReader/FileWriter不能指定编码类型,只能使用默认编码,InputStreamReader/OutputStreamWriter 可以指定编码类型

   故代码做如下更改

1 BufferedReader read = new BufferedReader(new InputStreamReader(
new FileInputStream("D:\\mys\\utf-8.txt"), "UTF-8")); 2 String str = read.readLine(); 3 System.out.println(str); 4 read.close();

  此时,输出结果正常无乱码产生。

  字符缓冲流向磁盘写入文件

  情况一:由于没有关闭输出流,磁盘文件未成功写入数据。执行 bw.close() 后数据写入

1 BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\mys\\sss.txt"));
2         String str = "好朋友呵请问你西游何时回还?可怕的岩山栈道实在难以登攀!";
3         bw.write(str);

  情况二:数据正常写入到磁盘

BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\mys\\sss.txt"));
        String str = "好朋友呵请问你西游何时回还?可怕的岩山栈道实在难以登攀!";
        bw.write(str);
        bw.flush();
       //bw.close();

    这是因为,对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush()将会使内存中的数据立刻写出

 

文本文件和字符流 / 计算机程序的思维逻辑

 

posted @ 2018-02-26 21:12  TigerExpensive  阅读(282)  评论(0编辑  收藏  举报