articleList

03-Reader、Writer字符流

2025/03/14 posted in  IO
Tags: 

第1集 Java字符输入流Reader案例实战

简介:Java字符输入流Reader案例实战

  • Reader类

    • Reader是所有字符输入流的超类。它提供了读取字符流的基本方法,如read(), read(char[] cbuf, int off, int len)
    • 由于Reader是抽象类,通常使用它的子类如FileReader, BufferedReader, InputStreamReader等来创建字符输入流对象。
  • Reader常用方法

    • int read(): 读取单个字符。如果已到达流的末尾,则返回-1。
    • int read(char[] cbuf): 读取字符到指定的字符数组。返回读取的字符数,如果已到达流的末尾,则返回-1。
    • int read(char[] cbuf, int off, int len): 读取字符到指定字符数组。返回读取的字符数,如果已到达流的末尾返回-1。
    • void close(): 关闭流并释放与之相关联的系统资源。
  • 常见子类

    • FileReader 用来读取字符文件的实现类
    public FileReader(String fileName) throws FileNotFoundException {
        super(new FileInputStream(fileName));
    }
    
    public FileReader(File file) throws FileNotFoundException {
        super(new FileInputStream(file));
    }
    
  • 案例实战

    import java.io.FileReader;  
    import java.io.IOException;  
    import java.io.Reader;  
      
    public class FileReaderExample {  
        public static void main(String[] args) {  
        
            String filePath = "example.txt"; // 替换为你的文件路径  
         		try (Reader reader  = new FileReader(filePath);){
    
                char[] buffer = new char[1024];
                int bytesRead;
    
                while ((bytesRead = reader.read(buffer)) != -1) {
                    // 输出读取的字符
                    for (int i = 0; i < bytesRead; i++) {
                        char c = buffer[i];
                        System.out.print(c);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }  
    }
    

第2集 Java字符输出流Writer案例实战

简介:Java字符输出流Writer案例实战

  • 什么是Writer

    • 在Java中,Writer是所有字符输出流的超类。它提供了写入字符流的基本方法,如write(int c)write(char[] cbuf)
    • Writer是抽象类,通常使用它的子类如FileWriterBufferedWriterOutputStreamWriter等来创建字符输出流对象。
  • Writer常用方法

    • void write(int c): 写入单个字符。

    • void write(char[] cbuf): 写入字符数组。

    • void write(String str): 写入字符串。

    • void write(String str, int off, int len): 写入字符串的某一部分,off是字符串开始索引,len是要写入的字符个数。

    • void flush(): 刷新该流的缓冲。

    • void close(): 关闭此流,但要先刷新它

  • 常见子类

    • FileWriter 用来写出字符文件的实现类
    //如果文件不存在,这会自动创建。如果文件存在,则会覆盖
    public FileWriter(String fileName) throws IOException
    
    //如果文件不存在,这会自动创建。如果文件存在,则会覆盖
    public FileWriter(File file) throws IOException
    
    //加入true参数,会实现对文件的续写,使用false则会实现对文件的覆盖
    public FileWriter(String fileName, boolean append) throws IOException 
    
    //加入true参数,会实现对文件的续写,使用false则会实现对文件的覆盖
    public FileWriter(File file, boolean append) throws IOException 
    
  • 案例实战

    import java.io.FileWriter;  
    import java.io.IOException;  
      
    public class FileWriterExample {  
        public static void main(String[] args) {  
            String filePath = "output.txt"; // 替换为你的文件路径  
             try (FileWriter writer = new FileWriter(filePath);){
                
                String data = "Hello, World!";
                writer.write(data);
                writer.flush(); // 刷新缓冲区,确保数据被写入文件  
            } catch (IOException e) {
                e.printStackTrace();
            } 
        }  
    }
    

第3集 Buffer字符输入和输出流介绍和案例实战

简介:Buffer字符输入和输出流介绍和案例实战

  • BufferedReader和BufferedWriter

    • 是用于处理字符流的两个重要类,它们分别用于从字符输入流中读取数据和向字符输出流中写入数据
    • 也是为了提高字符流读写的效率,引入了缓冲机制
    • 采用包装设计模式(锦上添花),这两个类都提供了缓冲功能,使得读写操作更加高效
  • BufferedReader

    • 用于从字符输入流中读取文本,并缓冲字符以便有效地读取。

    • 当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并放满缓冲区

    • 而之后若使用read()方法,会先从缓冲区中进行读取,如果缓冲区数据不足,才会再从文件中读取

    • 提供了诸如read(), readLine(), 和 close() 等方法

    • 构造函数 BufferedReader(Reader in)

    • 常用方法

      • int read(): 读取单个字符。
      • int read(char[] cbuf, int off, int len): 将字符读入数组的某一部分。
      • String readLine(): 读取一整行文本行,返回一整行字符串,如果读到行尾了就返回null, 返回的一行字符中不包含换行符
      • void close(): 关闭流并释放与之相关联的系统资源。
  • BufferedWriter

    • 用于将文本写入字符输出流,缓冲字符以便有效地写入。
    • 写入的数据并不会先输出到目的地,而是先存储至缓冲区中,如果缓冲区中的数据满了,才会一次对目的地进行写出
    • 提供了诸如write(), newLine(), 和 close() 等方法。
    • 构造函数 BufferedWriter(Writer out)
    • 常用方法
      • void write(int c): 写入单个字符。
      • void write(char[] cbuf, int off, int len): 写入字符数组的一部分。
      • void write(String s, int off, int len): 写入字符串的一部分。
      • void newLine(): 写如一个换行符号。
      • void close(): 关闭流并释放与之相关联的系统资源。
  • 案例实战:进行文件读写操作

    public class BufferedRWDemo {
        public static void main(String[] args) {
            String dir = "/Users/xdclass/Desktop/coding/xdclass-account/src/chapter12/";
            String inputName = dir + "input.txt";
            String outputName = dir + "output.txt";
    
            try(
                    BufferedReader br = new BufferedReader(new FileReader(inputName));
                    BufferedWriter bw = new BufferedWriter(new FileWriter(outputName));
            ) {
                String line;
                //逐行读取,并写入文件,readLine是不会读取换行符号
                while ((line = br.readLine())!=null){
                    bw.write(line);
                    bw.newLine();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
    
        }
    }
    
  • 注意事项

    • 资源自动管理try-with-resources语句会自动关闭实现了AutoCloseable接口的资源,无需在finally块中显式关闭。
    • 异常处理:如果在try块中发生了异常,该异常会被捕获,并可以在catch块中进行处理。
    • 文件路径和权限:确保提供的文件路径是正确的,并且应用程序有足够的权限来读取输入文件和写入输出文件。
    • 字符编码
      • 默认情况下,FileReaderFileWriter使用平台的默认字符编码。
      • 如果需要指定字符编码,可以使用InputStreamReaderOutputStreamWriter来包装

第4集 字符流和字节流的桥梁InputStreamReader

简介:讲解字符流和字节流之间的转换InputStreamReader

  • InputStreamReader

    • 是一个桥接器,它允许应用程序将字节流(InputStream)转换为字符流(Reader)。

    • 这在处理文本文件或网络数据流时特别有用,因为文本数据通常是以字符为单位进行处理的

    • 将字节流转换为字符流, 字节流通向字符流的桥梁, 如果不指定字符集编码,则解码过程将使用平台默认的字符编码

    • 它继承自Reader类,主要作用是将字节流中的数据解码成字符流,以便可以使用字符流相关的API来处理数据。

    • 通常会使用InputStreamReader来包装一个InputStream对象,例如FileInputStream,以便读取文本文件

    • 构造函数

      //使用系统默认编码集
      public InputStreamReader(InputStream in)
      
      //指定指定编码集创建对象
      public InputStreamReader(InputStream in, String charsetName)
      
    • 常用方法

      • int read(): 读取单个字符。
      • int read(char[] cbuf, int off, int len): 将字符读入数组的某一部分。
      • void close(): 关闭流并释放与之相关联的系统资源。
  • 案例实战:使用InputStreamReader读取文本文件的示例

    import java.io.FileInputStream;  
    import java.io.IOException;  
    import java.io.InputStreamReader;  
      
    public class InputStreamReaderExample {  
        public static void main(String[] args) {  
            String filePath = "example.txt"; // 文本文件路径  
      
            // 使用try-with-resources语句读取文件  
            try (FileInputStream fileInputStream = new FileInputStream(filePath);  
                 InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8")) {  
      
                // 假设我们有一个足够大的字符数组来存储文件内容  
                char[] buffer = new char[1024];  
                int bytesRead;  
      
                // 读取文件内容到buffer中  
                while ((bytesRead = inputStreamReader.read(buffer)) != -1) {  
                    // 处理读取到的字符(这里只是简单地打印到控制台)  
                    for (int i = 0; i < bytesRead; i++) {  
                        System.out.print(buffer[i]);  
                    }  
                }  
      
                // 注意:由于使用了try-with-resources语句,inputStreamReader和fileInputStream都会在此处自动关闭  
            } catch (IOException e) {  
                e.printStackTrace();  
                // 处理文件读取时的异常  
            }  
      
            // 无需在finally块中显式关闭inputStreamReader和fileInputStream,因为try-with-resources已经处理了  
        }  
    }
    
  • 注意事项

    • 资源自动管理:使用try-with-resources语句可以确保资源在try块结束后被自动关闭,无需在finally块中显式关闭。
    • 文件路径和权限:确保提供的文件路径是正确的,并且应用程序有足够的权限来读取文件。
    • 字符编码
      • 在创建InputStreamReader时,可以指定字符编码。如果不指定,将使用系统的默认字符集。
      • 在处理文本文件时,确保使用正确的字符编码以避免乱码问题。

第5集 字符流和字节流的桥梁OutputStreamWriter

简介:讲解字符流和字节流之间的转换OutputStreamWriter

  • OutputStreamWriter(继承writer)

    • 它继承自Writer类,主要作用是将字符流中的字符转换为字节,并写入到与之关联的字节输出流(如FileOutputStream)中

    • 是一个字符流类,它用于将字符流转换为字节流,以便写入到输出流中,如文件或网络连接。

    • 当我们需要将文本数据写入到字节流时,OutputStreamWriter非常有用

    • 构造函数

      //使用系统默认编码集
      public OutputStreamWriter(OutputStream out)
      
      //指定指定编码集创建对象
      public OutputStreamWriter(OutputStream out, String charsetName)
      
    • 常用API

      • void write(int c): 写入单个字符。

      • void write(char[] cbuf, int off, int len): 写入字符数组的某一部分。

      • void write(String str): 写入字符串。

      • void flush(): 刷新流,确保所有字符都被写出。

      • void close(): 关闭流并释放与之相关联的系统资源。

  • 案例实战:将数据写入到文件的示例

    import java.io.FileOutputStream;  
    import java.io.IOException;  
    import java.io.OutputStreamWriter;  
      
    public class OutputStreamWriterExample {  
        public static void main(String[] args) {  
            String filePath = "output.txt"; // 输出文件路径  
            String textToWrite = "Hello, World!"; // 要写入的文本  
      
            // 使用try-with-resources语句写入文件  
            try (FileOutputStream fileOutputStream = new FileOutputStream(filePath);  
                 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF-8")) {  
      
                // 写入文本到文件  
                outputStreamWriter.write(textToWrite);  
      
                // 刷新流以确保所有数据都被写出  
                outputStreamWriter.flush();  
      
                // 注意:由于使用了try-with-resources语句,outputStreamWriter和fileOutputStream都会在此处自动关闭  
            } catch (IOException e) {  
                e.printStackTrace();  
                // 处理文件写入时的异常  
            }  
      
            // 无需在finally块中显式关闭outputStreamWriter和fileOutputStream,因为try-with-resources已经处理了  
      
            System.out.println("文本已成功写入到文件:" + filePath);  
        }  
    }
    
  • 注意事项

    • 资源自动管理try-with-resources语句确保了在try块结束后,所有声明的资源都会自动关闭,无需在finally块中显式关闭。

    • 刷新流try-with-resources会在结束时自动关闭流,但希望在关闭之前所有数据都被写出,可以显式调用flush()方法。

    • 字符编码

      • 在创建OutputStreamWriter时,可以指定字符编码。
      • 如果不指定,将使用系统的默认字符集。在处理文本文件时,确保使用正确的字符编码以避免乱码问题。
    • 文件路径和权限:确保提供的文件路径是正确的,并且应用程序有足够的权限来写入文件。

第6集 课程作业之字符流实现文本批量修改器

简介: 课程作业之字符流实现文本批量修改器

  • 作业需求

    • 编写一个Java程序,该程序使用字符流(BufferedReaderBufferedWriter)来读取一个文本文件的内容,
    • 并将其中所有的“apple”替换为“orange”,然后将修改后的内容写入到一个新的文件中。
  • 实现效果

    • 代码保存为TextFileModifier.java
    • 创建一个名为source.txt的文本文件,并在其中写入一些包含“apple”的文本。
    • 编译并运行TextFileModifier程序。
    • 程序运行后,会创建一个名为modified.txt的新文件,其中包含修改后的内容(所有“apple”替换为“orange”)。
  • 案例代码

    import java.io.*;  
      
    public class TextFileModifier {  
        public static void main(String[] args) {  
            // 定义源文件和目标文件路径  
            String sourceFilePath = "source.txt";  
            String destinationFilePath = "modified.txt";  
      
            try (  
                // 使用BufferedReader读取源文件内容  
                BufferedReader reader = new BufferedReader(new FileReader(sourceFilePath));  
                // 使用BufferedWriter写入修改后的内容到目标文件  
                BufferedWriter writer = new BufferedWriter(new FileWriter(destinationFilePath))  
            ) {  
                String line;  
                // 逐行读取源文件  
                while ((line = reader.readLine()) != null) {  
                    // 替换所有"apple"为"orange"  
                    String modifiedLine = line.replaceAll("apple", "orange");  
                    // 写入修改后的行到目标文件  
                    writer.write(modifiedLine);  
                    // 写入换行符以保持格式  
                    writer.newLine();  
                }  
      
                // 刷新流以确保所有数据都被写出  
                writer.flush();  
      
                // 输出成功信息  
                System.out.println("File modified successfully!");  
      
            } catch (IOException e) {  
                e.printStackTrace();  
                System.out.println("An error occurred while modifying the file.");  
            }  
        }  
    }