zoukankan      html  css  js  c++  java
  • 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

     备注:

      字符' '或' '或' '被视为换行符,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()将会使内存中的数据立刻写出

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

  • 相关阅读:
    [ERR] Node 10.211.55.8:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    PAT A1137 Final Grading (25 分)——排序
    PAT A1136 A Delayed Palindrome (20 分)——回文,大整数
    PAT A1134 Vertex Cover (25 分)——图遍历
    PAT A1133 Splitting A Linked List (25 分)——链表
    PAT A1132 Cut Integer (20 分)——数学题
    PAT A1130 Infix Expression (25 分)——中序遍历
    PAT A1142 Maximal Clique (25 分)——图
    PAT A1141 PAT Ranking of Institutions (25 分)——排序,结构体初始化
    PAT A1140 Look-and-say Sequence (20 分)——数学题
  • 原文地址:https://www.cnblogs.com/SacredOdysseyHD/p/8476055.html
Copyright © 2011-2022 走看看