新版Java进阶之Reader-Writer字符流

一、Java字符输入流Reader

1.1 Reader类

Reader 是所有字符输⼊流的超类。它提供了读取字符流的基本⽅法,如 read() , read(char[] cbuf, int off, int len) 等

由于 Reader 是抽象类,通常使⽤它的⼦类如 FileReader , BufferedReader , InputStreamReader 等来创建字符输⼊流对象。

1.2 Reader常用方法

int read() : 读取单个字符。如果已到达流的末尾,则返回-1。

int read(char[] cbuf) : 读取字符到指定的字符数组。返回读取的字符数,如果已到达流的末尾, 则返回-1。

int read(char[] cbuf, int off, int len) : 读取字符到指定字符数组。返回读取的字符数,如 果已到达流的末尾返回-1。

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

1.3 常见子类

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();
       }
   }  
}

 

二、Java字符输出流Writer

2.1 什么是Writer?

在Java中, Writer 是所有字符输出流的超类。它提供了写⼊字符流的基本⽅法,如 write(int c) 、 write(char[] cbuf) 等

Writer 是抽象类,通常使⽤它的⼦类如 FileWriter 、 BufferedWriter 、 OutputStreamWriter 等 来创建字符输出流对象。

2.2 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() : 关闭此流,但要先刷新它。

2.3 常见子类

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();
       } 
   }  
}

 三、Buffer字符输入和输出流

BufferedReader和BufferedWriter

        是⽤于处理字符流的两个重要类,它们分别⽤于从字符输⼊流中读取数据和向字符输出流中写⼊数据

        也是为了提⾼字符流读写的效率,引⼊了缓冲机制

        采⽤包装设计模式(锦上添花),这两个类都提供了缓冲功能,使得读写操作更加⾼效

3.1 BufferedReader

    ⽤于从字符输⼊流中读取⽂本,并缓冲字符以便有效地读取。

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

    ⽽之后若使⽤read()⽅法,会先从缓冲区中进⾏读取,如果缓冲区数据不⾜,才会再从⽂件中读取

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

    构造函数 BufferedReader(Reader in)

3.1.1 常⽤⽅法

     int read() : 读取单个字符。

    int read(char[] cbuf, int off, int len) : 将字符读⼊数组的某⼀部分。

    String readLine() : 读取⼀整⾏⽂本⾏,返回⼀整⾏字符串,如果读到⾏尾了就返回null, 返回 的⼀⾏字符中不包含换⾏符

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

3.2 BufferedWriter

    ⽤于将⽂本写⼊字符输出流,缓冲字符以便有效地写⼊。

    写⼊的数据并不会先输出到⽬的地,⽽是先存储⾄缓冲区中,如果缓冲区中的数据满了,才会⼀次对⽬ 的地进⾏写出

    提供了诸如 write() , newLine() , 和 close() 等⽅法。

    构造函数 BufferedWriter(Writer out)

3.2.1 常⽤⽅法

    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/xdclassaccount/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();
       }
   }
}

四、字符流和字节流的桥梁InputStreamReader

4.1 InputStreamReader

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

这在处理⽂本⽂件或⽹络数据流时特别有⽤,因为⽂本数据通常是以字符为单位进⾏处理的

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

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

通常会使⽤ InputStreamReader 来包装⼀个 InputStream 对象,例如 FileInputStream ,以便读取 ⽂本⽂件 

4.2 构造方法

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

4.3 常用方法

int read() : 读取单个字符。

int read(char[] cbuf, int off, int len) : 将字符读⼊数组的某⼀部分。

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

案例实战:

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已经处理了
 
   }  
}

五、字符流和字节流的桥梁OutputStreamWriter

5.1 OutputStreamWriter

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

是⼀个字符流类,它⽤于将字符流转换为字节流,以便写⼊到输出流中,如⽂件或⽹络连接。

 当我们需要将⽂本数据写⼊到字节流时, OutputStreamWriter ⾮常有⽤

5.2 构造函数

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

5.3 常用方法 

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-withresources已经处理了
 
  
       System.out.println("⽂本已成功写⼊到⽂件:" + filePath);  
   }  
}

 

 

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值