13.3.1 面向字符的输入流

image.png

类Reader的主要子类及说明

类名 构造方法的主要参数 功能描述
CharArrayReader 字符数组char[] 用于对字符数组中的数据进行转换
BufferedReader 类Reader的对象 为输入提供缓冲的功能,提高效率
LineNumberReader 类Reader的对象 为输入数据附加行号
InputStreamReader InputStream的对象 将面向字节的输入流转换为字符输入流
FileReader 文件对象或字符串表示的文件名 文件作为输入源
PipedReader PipedWriter的对象 与另一输出管道相连,读取另一管道写入的字符
StringReader 字符串 以程序中的一字符串作为输入源,通常用于对字符串中的数据进行转换

类Reader的方法

  • public int read():从流中读一个字符,返回字符的整数编码,如果读至流的末尾,则返回-1
  • public int read(char[] buf, int off, int len) :从输入流读指定长度的数据到字符数组,数据从字节数组的off处开始存放,如果输入流无数据可读则返回-1
  • public int read(char[] buf) : 等价于read(buf,0,buf.length)形式
  • public long skip(long n) :指针跳过n个字节

    LineNumberReader类的使用

    ```java 从一个文本文件中读取数据加上行号后显示 import java.io.*; public class AddLineNo { public static void main(String[] args) {
    1. try
    2. {
    3. FileReader file= new FileReader("AddLineNo.java");
    4. LineNumberReader in=new LineNumberReader(file);
    5. boolean eof = false;
    6. while (!eof)
    7. {
    8. String x= in.readLine(); 利用LineNumberReaderreadLine()方法从文件逐行读取,末尾返回null
    9. if (x == null) //是否读至文件尾
    10. eof = true;
    11. else
    12. System.out.println(in.getLineNumber()+":"+x); 利用getLineNumber()方法得到行号与文本拼接后输出
    13. }
    14. in.close();
    15. } catch (IOException e) { };
    }

例 在屏幕上显示文件内容 (单个字符读) import java.io.*; public class test13_4 { public static void main(String args[]) { try { FileReader infile = new FileReader(args[0]); 以字符为单位访问 //FileReader infile = new FileReader(“test13_4.java”);
int charRead = infile.read();

  1. while (charRead != -1) {
  2. System.out.print((char) charRead);
  3. //System.out.printf("%c", charRead);
  4. charRead = infile.read();
  5. }
  6. }catch(ArrayIndexOutOfBoundsException e){
  7. System.out.println("需要提供一个文件名作为命令行参数 ");
  8. }catch(FileNotFoundException e){
  9. System.out.println("file not find! ");
  10. }catch(IOException e){};
  11. }

}

在屏幕上显示文件内容(行读) import java.io.*; public class DisplayFile { public static void main(String args[]) { try { BufferedReader infile = new BufferedReader(new FileReader(args[0]));
//BufferedReader infile = new BufferedReader(new FileReader(“test13_4.java”)); String x = infile.readLine(); while (x != null) { System.out.println(x); //System.out.printf(“%s\n”, x); x = infile.readLine(); } }catch(ArrayIndexOutOfBoundsException e) { System.out.println(“需要提供一个文件名作为命令行参数 “); }catch(FileNotFoundException e) { System.out.println(“file not find! “); }catch(IOException e){}; } }

  1. <a name="WyUZk"></a>
  2. ## 13.3.2 面向字符的输出流
  3. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/26772170/1651067919675-f02ac5ad-d08f-4ede-a520-2865b368a48c.png#clientId=ue664924c-c297-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=368&id=u49f64497&margin=%5Bobject%20Object%5D&name=image.png&originHeight=561&originWidth=832&originalType=binary&ratio=1&rotation=0&showTitle=false&size=23958&status=done&style=none&taskId=u4fb2eaee-5eae-450a-a7a3-5406bc2fcf7&title=&width=546)
  4. <a name="dOtux"></a>
  5. ### 类Writer的主要子类及说明
  6. | 类名 | 构造方法的主要参数 | 功能描述 |
  7. | --- | --- | --- |
  8. | CharArrayWriter | 字符数组char[] | 用于对字符数组中的数据进行转换 |
  9. | BufferedWriter | 类Writer的对象 | 为输出提供缓冲的功能,提高效率 |
  10. | OutputStreamWriter | OutputStream的对象 | 将面向字节的输出流转换为字符输出流 |
  11. | FileWriter | 文件对象或字符串表示的文件名 | 文件作为输出源 |
  12. | PipedWriter | **PipedReader的对象 ** | **与另一输出管道相连,写入数据给另一管道供其读取 ** |
  13. | StringWriter | **字符串 ** | **以程序中的一字符串作为输出源,用于对字符数组中的数据进行转换 ** |
  14. | FilterWriter | **Writer的对象 ** | **装饰另一输出流以提供附加的功能 ** |
  15. | PrinterWriter | **Writer的对象或OutputStream的对象 ** | **为所装饰的输出流提供打印输出,与类PrintStream只有细微差别。 ** |
  16. 类Writer提供的方法与OutputStream类似,只是将基于byte的参数改为基于char。 <br />几种常用形态如下。
  17. - `public void **write(int c)** ` 往文件写入一个字符,它是将整数的低16位对应的数据写入文件,高16位将忽略。
  18. - `public void **write(char[] cbuf)**` 将一个字符数组写入文件
  19. - `public void **write(String str)**` 将一个字符串写入文件
  20. **以上方法均可处理汉字字符写入。**
  21. ```java
  22. 用FileWriter流将ASCII英文字符集字符写入到文件
  23. import java.io.*;
  24. public class CharWrite
  25. {
  26. public static void main(String args[])
  27. {
  28. try
  29. {
  30. FileWriter fw=new FileWriter("charset.txt ");
  31. for(int i=32;i<126;i++)
  32. fw.write(i);
  33. fw.close();
  34. } catch (IOException e) { }
  35. }
  36. }
  37. 运行结果:(乱码)
  38. !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
  39. 【说明】FileWriter类的构造方法、write()以及close()方法可能产生IO异常,必须进行异常捕获,文件不存在自动创建
  40. 【注意】Writer类的3个方法均可实现汉字写入
  41. 1、char[] x={'高','高','兴','兴'};
  42. fw.write(x);//输出:高高兴兴
  43. 2、fw.write("hello你好");//输出:hello你好
  44. 【拓展】要想输出整形数据,将fw.write(i);——————>fw.write(Integer.toString(i));整型数字转换为字符串
  45. 改编例13-5,将指定文件的内容加行号写入另一个文件。
  46. import java.io.*;
  47. public class AddLineNo
  48. {
  49. public static void main(String[] args)
  50. {
  51. try
  52. {
  53. FileReader file= new FileReader("AddLineNo.java");
  54. FileWriter out=new FileWriter("target.txt");
  55. LineNumberReader in=new LineNumberReader(file);
  56. while (true)
  57. {
  58. String x= in.readLine();
  59. if (x == null)
  60. break;
  61. else
  62. out.write(in.getLineNumber()+":"+x+"\r\n");
  63. }
  64. out.close();
  65. } catch (IOException e) {};
  66. }
  67. }

思考题

给指定的Java源程序所有行加上行号,行号和程序之间间隔2个空格。处理结果写入到另一个文件(target.txt)中。

  • Java源程序的文件名由命令行参数指定。
  • 行号占用位数由命令行参数确定(2或3)。
    • 如果2位,则一位数的行号前面补0。
    • 如果为3位,则1位数补2个0,2位数补1个0。