第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()
: 关闭流并释放与之相关联的系统资源。
-
常见子类
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
是抽象类,通常使用它的子类如FileWriter
、BufferedWriter
、OutputStreamWriter
等来创建字符输出流对象。
-
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()
: 关闭此流,但要先刷新它
-
常见子类
//如果文件不存在,这会自动创建。如果文件存在,则会覆盖
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块中进行处理。
- 文件路径和权限:确保提供的文件路径是正确的,并且应用程序有足够的权限来读取输入文件和写入输出文件。
- 字符编码
- 默认情况下,
FileReader
和FileWriter
使用平台的默认字符编码。
- 如果需要指定字符编码,可以使用
InputStreamReader
和OutputStreamWriter
来包装
第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程序,该程序使用字符流(
BufferedReader
和BufferedWriter
)来读取一个文本文件的内容,
- 并将其中所有的“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.");
}
}
}