一、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);
}
}