当前位置: 首页 > news >正文

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)

  1. 编码转换:将字节按照指定的字符编码转换为字符
  2. 适配器模式:将 InputStream 适配为 Reader
  3. 字符流处理:继承自 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 包中

  1. 专门用于文件读取:简化了从文件读取字符的操作
  2. 字符流处理:自动处理字节到字符的转换
  3. 使用默认编码:使用系统默认字符编码(可能导致跨平台问题)
构造方法
构造方法描述
FileReader(String fileName)根据文件名创建 FileReader
FileReader(File file)根据 File 对象创建 FileReader
FileReader(FileDescriptor fd)根据文件描述符创建 FileReader

与 InputStreamReader 的区别

特性FileReaderInputStreamReader
用途专门用于文件可用于任何 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类
  1. 缓冲机制:默认8KB字符缓冲区(8192个字符)
  2. 行读取支持:独有的readLine()方法
  3. 标记/重置功能:支持mark()reset()操作
  4. 线程不安全:不适合多线程环境直接共享使用
构造方法
构造方法描述
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类
  1. 编码转换桥梁:将字符(Unicode)转换为字节(指定编码)
  2. 适配器模式:将 Writer 接口适配到 OutputStream
  3. 字符集支持:支持多种字符编码(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 包中

  1. 文件专用:专门用于向文件写入字符数据
  2. 编码简化:使用平台默认字符编码(可能导致跨平台问题)
  3. 便捷性:比 OutputStreamWriter + FileOutputStream 组合更简单
  4. 自动创建:如果文件不存在会自动创建(除非目录也不存在)
构造方法
构造方法描述示例
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)
主要方法

继承自 OutputStreamWriterWriter 的方法:

方法描述
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类
  1. 缓冲机制:默认8192字符(8KB)的缓冲区
  2. 行读取:独有的readLine()方法
  3. 标记支持mark()reset()方法实现回读功能
  4. 性能提升:比非缓冲读取快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)               // 跳过字符
http://www.lryc.cn/news/611818.html

相关文章:

  • 【Linux系统】进程间通信:命名管道
  • 嵌入式处理器指令系统:精简指令集RISC与复杂指令集CISC的简介,及区别
  • Chrontel 昆泰【CH7107B-BF】CH7107B ——HDMI to CVBS Converter
  • 【arcmap中shp图层数据导入到postgresql数据库中,中文出现乱码,怎么办?】
  • 使用 Maxwell 和 RabbitMQ 监控 Mysql Flowable 表变更
  • 医学影像PACS系统的设计与实现,PACS系统源码
  • LMS/NLMS最小均值算法:双麦克风降噪
  • python中的推导式
  • YOLOv5 上使用 **labelImg** 标注并训练自己的数据集
  • PyTorch生成式人工智能——Hugging Face环境配置与应用详解
  • 【32】C++实战篇—— m行n列的坐标点,求每行相邻点X差值dX,每列相邻点y差值dY,并以矩阵形式左端对齐
  • 远程连接----ubuntu ,rocky 等Linux系统,WindTerm_2.7.0
  • Spring选择哪种方式代理?
  • 阿里云DMS Data Copilot——高效智能的数据助手,助力企业实现数据驱动的未来
  • 深入理解 Maven POM 文件:核心配置详解
  • Jenkinsfile各指令详解
  • Java学习第一百零九部分——Jenkins(一)
  • 基于通用优化软件GAMS的数学建模和优化分析
  • AlphaEarth模型架构梳理及借鉴哪些深度学习领域方面的思想
  • React:受控组件和非受控组件
  • WebStorm转VSCode:高效迁移指南
  • 前端开发_怎么禁止用户复制内容
  • vue3 el-dialog自定义实现拖拽、限制视口范围增加了拖拽位置持久化的功能
  • 【前端开发】三. JS运算符
  • 2.6 sync
  • vue3 find 数组查找方法
  • JSON巴巴 - 专业JSON格式化工具:让任何JSON都能完美格式化
  • Excel将整列值转换为字符串
  • Git 乱码文件处理全流程指南
  • 通过最严时序标准,再登产业图谱榜首,TDengine 时序数据库在可信数据库大会荣获双荣誉