21.1 字符输入流

字符流(JavaIO的Reader和Writer)功能与InputStream和OutputStream非常类似,InputStream和OutputStream基于字节处理,而字符流(Reader和Writer)是基于字符处理(但内部实现依然是根据字节流实现的)。主要用于读写文本。

21.1.1 Reader 类的常用方法

Reader类是JavaIO中所有Reader的基类。子类包括FileReader,BufferedReader,InputStreamReader,StringReader和其他Reader。

  1. read() ; 读取字符输入流。读取字符输入流的下一个字符,返回一个字符,意味着这个返回值的范围在0到65535之间(当达到流末尾时,同样返回-1)。这并不意味着Reader只会从数据源中一次读取2个字节,Reader会根据文本的编码,一次读取一个或者多个字节。

  2. read(char cbuf[]);读取字符输入流。读取多个字符,存入字符数组cbuf,返回实际读入的字符数。

  3. read(char cbuf[], int off, int len); 方法,读取字符输入流。每次读取len个字符,存入字符数组cbuf,从off下标开始存储。

  4. close(); 关闭当前流,释放与该流相关的资源,防止资源泄露。在带资源的try语句中将被自动调用。关闭流之后还试图读取字符,会出现IOException异常。

21.1.2 Reader类的子类:FileReader

FileReader类从InputStreamReader类继承而来(间接继承了Reader)。该类按字符读取流中数据。

21.1.3 FileReader构造方法和常用方法

21.1.3.1 构造方法

  1. FileReader(File file);通过打开一个到实际文件的连接来创建一个FileReader,该文件通过文件系统中的File对象file指定。

  2. FileReader(String fileName) ; 通过打开一个到实际文件的连接来创建一个FileReader,该文件通过文件系统中的路径名name指定。

  3. (了解)FileReader(FileDescriptor fd) ; 在给定从中读取数据的FileDescriptor的情况下创建一个新 FileReader。

    提示:FileDescriptor 是“文件描述符”。

    其中有三个属性:​

    1. in 标准输入(键盘)的描述符(从键盘输入读取流)

    2. out 标准输出(屏幕)的描述符(讲流输出到控制台上)

    3. err 标准错误输出(屏幕)的描述符(将流以红色的字体输出到控制台上)

    代码示例:

    try {
        FileWriter fw = new FileWriter(FileDescriptor.out);
        fw.write("我是爱你的。");
        fw.flush();
        fw.close();
    }...
    

    控制台输出:

21.1.3.2 常用方法

test.txt 文件内容(字符长度为17)

  1. read();读取字符输入流。读取字符输入流的下一个字符,返回一个字符。

    try {
        File file = new File("test.txt");
        FileReader fileReader = new FileReader(file);
        int read = fileReader.read();//默认第一次读取第一个字符
        System.out.println((char)read);
    }...
    

    结果:

  2. read(char cbuf[]);读取字符输入流。读取多个字符,存入字符数组cbuf,返回实际读入的字符数。

    try {
        File file = new File("test.txt");
        FileReader fileReader = new FileReader(file);
    
        char c [] = new char[20];
        int len = fileReader.read(c);//
        System.out.println("读取的字符长度为:"+len);
    
        for (char d : c) {
            System.out.print(d);
        }
    }...
    

    结果:

  3. read(char cbuf[], int off, int len);读取字符输入流。每次读取len个字符,存入字符数组cbuf,从off下标开始存储。

    try {
        File file = new File("test.txt");
        FileReader fileReader = new FileReader(file);
    
        char c [] = new char[20];
        int len = fileReader.read(c,2,8);//读取8个字符存入c数组,从下标2开始存储
        System.out.println("读取的字符长度为:"+len);
    
        for (char d : c) {
            System.out.print(d);
        }
    
    }
    

    结果:

  4. close();关闭当前流,释放与该流相关的资源,防止资源泄露。在带资源的try语句中将被自动调用。关闭流之后还试图读取字符,会出现IOException异常。

    try {
        File file = new File("test.txt");
        FileReader fileReader = new FileReader(file);
        int read = fileReader.read();//
        System.out.println((char)read);
        fileReader.close();//通过close()来关闭流,以释放系统资源。
    }...
    //或者在这里关闭
      ...finally {
            if(fileReader!=null)
                fileReader.close();
      }
    

    注意:

    1. 通常不使用close会导致内存泄露,垃圾回收机制会回收,但是最好自己显式关闭

    2. OutputStream的作用是如FileOutStream,当不调用close的时候,不会将缓存刷入文件中。

    所以:一般使用完IO流之后都要通过close()来关闭,以释放系统资源

21.2 字符输出流

21.2.1 Writer类的常用方法

  1. write (Stringstr); 将指定的字符串写入此输出流。

  2. write(char[]cbuf, intoff, intlen); 将指定 char 数组中从偏移量off开始的len个字符写入此输出流。

  3. flush(); 用于清空缓存里的数据,并通知底层去进行实际的写操作。(强制把缓存区里面的数据写入到文件)

  4. close();关闭当前流,释放与该流相关的资源。

21.2.2 Writer类的子类:FileWriter

FileWriter类从OutputStreamReader类继承而来(间接继承Writer类)。该类按字符向流中写入数据。

21.2.3 FileWriter 构造方法和常用方法

21.2.3.1 构造方法

  1. FileWriter(File file);通过打开一个到实际文件的连接来创建一个FileWriter,该文件通过文件系统中的File对象file指定。

  2. FileWriter(File file, boolean append);通过打开一个到实际文件的连接来创建一个FileWriter,该文件通过文件系统中的File对象file指定。如果第二个参数为true,则将字符写入文件末尾处,而不是写入文件开始处。

  3. FileWriter(String fileName);通过打开一个到实际文件的连接来创建一个FileWriter,该文件通过文件系统中的路径名name指定。

  4. FileWriter(String fileName, boolean append);通过打开一个到实际文件的连接来创建一个FileWriter,该文件通过文件系统中的路径名name指定。如果第二个参数为true,则将字符写入文件末尾处,而不是写入文件开始处。

  5. FileWriter(FileDescriptor fd);在给定从中写入数据的FileDescriptor的情况下创建一个新 FileReader。(可以向控制台输出文本流)。

21.2.3.2 常用方法

  1. write (Stringstr); 将指定的字符串写入此输出流。

    try {
        File file = new File("test.txt");
        Writer fileWriter = new FileWriter(file);
        fileWriter.write("十年之前,我不认识你。");
        fileWriter.flush();
        fileWriter.close();
    }...
    

    结果:

  2. write(int c );将指定的字符写入此输出流。

    try {
        File file = new File("test.txt");
        Writer fileWriter = new FileWriter(file);
        fileWriter.write('育');
        fileWriter.flush();
        fileWriter.close();
    }...
    

    结果:

  3. write(char[]cbuf);将 cbuf 字符数组写入此输出流。

    try {
        File file = new File("test.txt");
        Writer fileWriter = new FileWriter(file);
        char[] charArray = "字符串转字符数组".toCharArray();
        fileWriter.write(charArray);
        fileWriter.flush();
        fileWriter.close();
    }
    

    结果:

  4. write(char[]cbuf, intoff, intlen);将 cbuf 字符数组,按偏移量off开始的len个字符写入此输出流。

    try {
        File file = new File("test.txt");
        Writer fileWriter = new FileWriter(file);
        char[] charArray = "字符串转字符数组".toCharArray();
        fileWriter.write(charArray, 1, 5);//从偏移量 1 开始,写入5个字符。
        fileWriter.flush();
        fileWriter.close();
    }
    

    结果:

  5. write(String str, intoff, intlen);

    try {
        File file = new File("test.txt");
        Writer fileWriter = new FileWriter(file);
        String str ="字符串也可以制定写的内容";
        fileWriter.write(str, 3, 5);
        fileWriter.flush();
        fileWriter.close();
    }
    

    结果:

results matching ""

    No results matching ""