字符流的继承类图

  

javaException转字符串 java 字符串转inputstream_数组

主要字符流,它们有:

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

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

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

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

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

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

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

一、Reader/Writer

javaException转字符串 java 字符串转inputstream_字符流_02

javaException转字符串 java 字符串转inputstream_构造方法_03

二、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)

可以输出平台特定的换行符:

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()将会使内存中的数据立刻写出