JAVA高级编程第七章
JAVA高级编程
文章目录
- JAVA高级编程
- 第七章 输入和输出处理(二)
- Reader类
- 常用子类
- 核心方法
- InputStreamReader类
- 构造方法
- 常用方法
- 使用示例
- FileReader类
- 构造方法
- 使用示例
- BufferedReader类
- 构造方法
- 方法
- 缓冲区
- Writer类
- 常用子类
- 核心方法
- OutputStreamWriter类
- 构造方法
- 常用方法
- 使用示例
- FileWriter类
- 构造方法
- 主要方法
- 使用示例
- BufferedWriter类
- 构造方法
- 方法
第七章 输入和输出处理(二)
Reader类
位于java.io包中,用于读取字符流
常用子类
InputStreamReader
:将字节流转换为字符流FileReader
:用于读取文件中的字符(实际上是InputStreamReader
的子类)BufferedReader
:提供缓冲功能,提高读取效率StringReader
:从字符串中读取字符CharArrayReader
:从字符数组中读取字符
组件 | 作用 | 是否缓冲 |
---|---|---|
FileInputStream | 提供原始字节流 | 无缓冲 |
InputStreamReader | 字节到字符的转换 | 无缓冲 |
BufferedReader | 提供字符缓冲 | 有缓冲 |
核心方法
方法 | 描述 |
---|---|
int read() | 读取单个字符,返回字符的整数值,如果到达流末尾则返回-1 |
int read(char[] cbuf) | 将字符读入数组,返回读取的字符数 |
int read(char[] cbuf, int off, int len) | 将字符读入数组的指定部分 |
long skip(long n) | 跳过指定数量的字符 |
boolean ready() | 判断是否准备好被读取 |
void close() | 关闭流并释放相关资源 |
InputStreamReader类
将字节流 (InputStream
) 转换为字符流 (Reader
)
- 编码转换:将字节按照指定的字符编码转换为字符
- 适配器模式:将
InputStream
适配为Reader
- 字符流处理:继承自
Reader
,提供字符流的读取能力
构造方法
构造方法 | 描述 |
---|---|
InputStreamReader(InputStream in) | 使用平台默认字符集创建 InputStreamReader |
InputStreamReader(InputStream in, String charsetName) | 使用指定字符集创建 InputStreamReader |
InputStreamReader(InputStream in, Charset cs) | 使用指定 Charset 对象创建 InputStreamReader |
InputStreamReader(InputStream in, CharsetDecoder dec) | 使用指定字符集解码器创建 InputStreamReader |
常用方法
除了继承自Reader的方法外,InputStreamReader还提供了:
方法 | 描述 |
---|---|
String getEncoding() | 返回此流使用的字符编码名称 |
使用示例
try (InputStreamReader reader = new InputStreamReader(new FileInputStream("example.txt"), "UTF-8")) {int data;while ((data = reader.read()) != -1) {char c = (char) data;System.out.print(c);}} catch (IOException e) {e.printStackTrace();}
FileReader类
继承自 InputStreamReader
,位于 java.io
包中
- 专门用于文件读取:简化了从文件读取字符的操作
- 字符流处理:自动处理字节到字符的转换
- 使用默认编码:使用系统默认字符编码(可能导致跨平台问题)
构造方法
构造方法 | 描述 |
---|---|
FileReader(String fileName) | 根据文件名创建 FileReader |
FileReader(File file) | 根据 File 对象创建 FileReader |
FileReader(FileDescriptor fd) | 根据文件描述符创建 FileReader |
与 InputStreamReader 的区别
特性 | FileReader | InputStreamReader |
---|---|---|
用途 | 专门用于文件 | 可用于任何 InputStream |
编码 | 使用平台默认 | 可指定任意编码 |
性能 | 相同 | 相同 |
灵活性 | 较低 | 较高 |
使用示例
//无缓冲区
try (FileReader reader = new FileReader("example.txt")) {int character;while ((character = reader.read()) != -1) {System.out.print((char) character);}} catch (IOException e) {e.printStackTrace();}
//直接使用 FileReader 效率较低,应配合 BufferedReader
//有缓冲区
try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}
//需要指定字符编码时
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("example.txt"), StandardCharsets.UTF_8))
BufferedReader类
- 缓冲机制:默认8KB字符缓冲区(8192个字符)
- 行读取支持:独有的
readLine()
方法 - 标记/重置功能:支持
mark()
和reset()
操作 - 线程不安全:不适合多线程环境直接共享使用
构造方法
构造方法 | 描述 |
---|---|
BufferedReader(Reader in) | 使用默认缓冲区大小(8KB) |
BufferedReader(Reader in, int sz) | 自定义缓冲区大小 |
方法
方法 | 描述 | 返回值 |
---|---|---|
read() | 读取单个字符 | 字符的int值,-1表示结束 |
read(char[] cbuf, int off, int len) | 批量读取字符 | 实际读取字符数 |
readLine() | 读取一行文本(不含换行符) | String或null(结束) |
skip(long n) | 跳过指定字符数 | 实际跳过的字符数 |
ready() | 是否可读 | boolean |
mark(int readAheadLimit) | 设置标记点 | void |
reset() | 重置到标记点 | void |
lines() | 返回Stream(Java8+) | 字符串流 |
缓冲区
使用示例
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;public class BufferedISRExample {public static void main(String[] args) {try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("example.txt"), "UTF-8"))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
}
调整缓冲区大小
// 可以自定义缓冲区大小(单位:字符)
new BufferedReader(reader, 16384); // 16KB缓冲区
InputStreamReader与BufferedReader比较
无缓冲区读取(低效)
// 每次读取都要访问磁盘
try (InputStreamReader reader = new InputStreamReader(new FileInputStream("example.txt"))) {int ch;while ((ch = reader.read()) != -1) { // 每次只读一个字符System.out.print((char)ch);}
}
有缓冲区读取(高效)
// 使用缓冲区批量读取
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("example.txt")))) {String line;while ((line = reader.readLine()) != null) { // 按行读取,但底层是批量获取System.out.println(line);}
}
Writer类
位于java.io包中,是所有字符输出流的父类
常用子类
子类 | 描述 |
---|---|
OutputStreamWriter | 字符流到字节流的桥梁 |
FileWriter | 文件字符输出流(OutputStreamWriter的子类) |
BufferedWriter | 缓冲字符输出流 |
StringWriter | 将输出收集到字符串缓冲区 |
CharArrayWriter | 将输出收集到字符数组 |
核心方法
方法 | 描述 |
---|---|
write(int c) | 写入单个字符 |
write(char[] cbuf) | 写入字符数组 |
write(char[] cbuf, int off, int len) | 写入字符数组的一部分 |
write(String str) | 写入字符串 |
write(String str, int off, int len) | 写入字符串的一部分 |
append(CharSequence csq) | 追加字符序列 |
append(CharSequence csq, int start, int end) | 追加字符序列的一部分 |
append(char c) | 追加单个字符 |
flush() | 刷新输出流 |
close() | 关闭输出流 |
OutputStreamWriter类
- 编码转换桥梁:将字符(Unicode)转换为字节(指定编码)
- 适配器模式:将 Writer 接口适配到 OutputStream
- 字符集支持:支持多种字符编码(UTF-8、GBK、ISO-8859-1等)
构造方法
构造方法 | 描述 | 示例 |
---|---|---|
OutputStreamWriter(OutputStream out) | 使用默认字符集 | new OutputStreamWriter(new FileOutputStream("file.txt")) |
OutputStreamWriter(OutputStream out, String charsetName) | 指定字符集名称 | new OutputStreamWriter(fos, "GBK") |
OutputStreamWriter(OutputStream out, Charset cs) | 使用Charset对象 | new OutputStreamWriter(fos, StandardCharsets.UTF_8) |
OutputStreamWriter(OutputStream out, CharsetEncoder enc) | 使用字符编码器 | new OutputStreamWriter(fos, Charset.forName("UTF-8").newEncoder()) |
常用方法
除了继承自Writer的方法外,特有方法:
方法 | 描述 |
---|---|
String getEncoding() | 返回使用的字符编码名称 |
void flush() | 刷新缓冲并强制写入底层流 |
void close() | 先刷新再关闭流 |
使用示例
try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("output.txt"), StandardCharsets.UTF_8)) {writer.write("这是UTF-8编码的文本\n");writer.append("第二行内容");System.out.println("使用编码: " + writer.getEncoding());} catch (IOException e) {e.printStackTrace();}
FileWriter类
继承自 OutputStreamWriter
,位于 java.io
包中
- 文件专用:专门用于向文件写入字符数据
- 编码简化:使用平台默认字符编码(可能导致跨平台问题)
- 便捷性:比
OutputStreamWriter + FileOutputStream
组合更简单 - 自动创建:如果文件不存在会自动创建(除非目录也不存在)
构造方法
构造方法 | 描述 | 示例 |
---|---|---|
FileWriter(String fileName) | 创建/覆盖指定文件 | new FileWriter("data.txt") |
FileWriter(String fileName, boolean append) | 追加模式写入 | new FileWriter("log.txt", true) |
FileWriter(File file) | 通过File对象创建 | new FileWriter(new File("data.txt")) |
FileWriter(File file, boolean append) | 追加模式File对象 | new FileWriter(file, true) |
FileWriter(FileDescriptor fd) | 通过文件描述符创建 | new FileWriter(FileDescriptor.out) |
主要方法
继承自 OutputStreamWriter
和 Writer
的方法:
方法 | 描述 |
---|---|
write(int c) | 写入单个字符 |
write(char[] cbuf) | 写入字符数组 |
write(String str) | 写入字符串 |
append(CharSequence csq) | 追加字符序列 |
flush() | 刷新缓冲区 |
close() | 关闭流 |
使用示例
import java.io.FileWriter;
import java.io.IOException;public class BasicFileWriter {public static void main(String[] args) {try (FileWriter writer = new FileWriter("output.txt")) {writer.write("第一行内容\n");writer.append("追加的第二行\n");writer.write(new char[]{'字', '符', '数', '组'});} catch (IOException e) {e.printStackTrace();}}
}
BufferedWriter类
- 缓冲机制:默认8192字符(8KB)的缓冲区
- 行读取:独有的
readLine()
方法 - 标记支持:
mark()
和reset()
方法实现回读功能 - 性能提升:比非缓冲读取快10-100倍
构造方法
构造方法 | 描述 | 推荐场景 |
---|---|---|
BufferedReader(Reader in) | 默认8KB缓冲区 | 通用场景 |
BufferedReader(Reader in, int sz) | 自定义缓冲区大小 | 大文件处理 |
方法
基础读取方法
int read() // 读取单个字符
int read(char[] cbuf) // 批量读取到字符数组
int read(char[] cbuf, int off, int len) // 读取到数组指定位置
行读取方法
String readLine() // 读取一行(不含换行符)
Stream<String> lines() // Java8+ 返回行流
缓冲控制
void mark(int readAheadLimit) // 设置标记点
void reset() // 返回到标记点
long skip(long n) // 跳过字符
int read() // 读取单个字符
int read(char[] cbuf) // 批量读取到字符数组
int read(char[] cbuf, int off, int len) // 读取到数组指定位置
**行读取方法**```java
String readLine() // 读取一行(不含换行符)
Stream<String> lines() // Java8+ 返回行流
缓冲控制
void mark(int readAheadLimit) // 设置标记点
void reset() // 返回到标记点
long skip(long n) // 跳过字符