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

《Java中的IO流》

目录

引言

一、IO流概述

​编辑

二、字节流体系

三、字符流体系

1. 常用字符流类

2. 文本文件读写示例

3. 编码问题处理

四、转换流

五、对象流与序列化

1. 序列化与反序列化


引言

IO(Input/Output)流是Java中处理输入输出的核心机制,无论是文件读写、网络通信还是内存操作,都离不开IO流。本文将全面介绍Java IO流体系,帮助你掌握这一重要技术。

一、IO流概述

IO流是Java中用于处理输入输出操作的抽象概念,可以想象成数据的"管道":

输入流:从数据源(如文件、网络等)读取数据到程序

输出流:将程序中的数据写入到目的地

Java IO流的主要分类:

按数据单位分:

字节流:以字节(8bit)为单位(适合所有类型数据)

字符流:以字符为单位(适合文本数据)

按流向分:

输入流:读取数据,

输出流:写入数据

按角色分:

节点流:直接操作数据源/目的地。

处理流:对现有流进行包装增强

二、字节流体系

字节流是Java IO的基础,所有InputStreamOutputStream的子类都是字节流。

1. 常用字节流类

类名描述
InputStream所有字节输入流的父类(抽象类)
OutputStream所有字节输出流的父类(抽象类)
FileInputStream文件字节输入流
FileOutputStream文件字节输出流
ByteArrayInputStream字节数组输入流
ByteArrayOutputStream字节数组输出流
BufferedInputStream缓冲字节输入流
BufferedOutputStream缓冲字节输出流

2. 文件读写示例

// 文件复制示例(字节流)
public static void copyFile(String src, String dest) throws IOException {try (InputStream in = new FileInputStream(src);OutputStream out = new FileOutputStream(dest)) {byte[] buffer = new byte[1024];int len;while ((len = in.read(buffer)) != -1) {out.write(buffer, 0, len);}}
}

3. 缓冲流的使用

缓冲流可以显著提高IO效率:

// 使用缓冲流提高效率
public static void bufferedCopy(String src, String dest) throws IOException {try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest))) {byte[] buffer = new byte[1024];int len;while ((len = bis.read(buffer)) != -1) {bos.write(buffer, 0, len);}}
}

三、字符流体系

字符流专门用于处理文本数据,底层实际还是字节流+编码转换。

1. 常用字符流类

类名描述
Reader所有字符输入流的父类
Writer所有字符输出流的父类
FileReader文件字符输入流
FileWriter文件字符输出流
CharArrayReader字符数组输入流
CharArrayWriter字符数组输出流
BufferedReader缓冲字符输入流
BufferedWriter缓冲字符输出流
InputStreamReader字节流转字符流
OutputStreamWriter字符流转字节流

2. 文本文件读写示例

// 文本文件读取(字符流)
public static String readTextFile(String filename) throws IOException {StringBuilder content = new StringBuilder();try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {String line;while ((line = reader.readLine()) != null) {content.append(line).append("\n");}}return content.toString();
}// 文本文件写入(字符流)
public static void writeTextFile(String filename, String content) throws IOException {try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) {writer.write(content);}
}

3. 编码问题处理

// 指定编码读写文件
public static void readWithEncoding(String filename, String charset) throws IOException {try (InputStreamReader isr = new InputStreamReader(new FileInputStream(filename), charset);BufferedReader br = new BufferedReader(isr)) {String line;while ((line = br.readLine()) != null) {System.out.println(line);}}
}

四、转换流

转换流是字节流和字符流之间的桥梁:

InputStreamReader:将字节输入流转换为字符输入流

OutputStreamWriter:将字符输出流转换为字节输出流

// 转换流示例
public static void convertStreamDemo() throws IOException {// 字节流 -> 字符流InputStream is = new FileInputStream("test.txt");Reader reader = new InputStreamReader(is, "UTF-8");// 字符流 -> 字节流OutputStream os = new FileOutputStream("output.txt");Writer writer = new OutputStreamWriter(os, "GBK");
}

五、对象流与序列化

Java提供了对象序列化机制,可以将对象转换为字节流进行存储或传输。

1. 序列化与反序列化

// 需要序列化的类必须实现Serializable接口
class Person implements Serializable {private static final long serialVersionUID = 1L;private String name;private int age;// 构造方法、getter/setter省略
}// 对象序列化
public static void serializeObject(Object obj, String filename) throws IOException {try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename))) {oos.writeObject(obj);}
}// 对象反序列化
public static Object deserializeObject(String filename) throws IOException, ClassNotFoundException {try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filename))) {return ois.readObject();}
}

Java IO流体系庞大但层次清晰,掌握其核心原理和常用类后,各种IO需求都能应对自如。随着Java版本更新,也出现了更多简化IO操作的API,但底层原理仍是IO流体系。


文章转载自:

http://pyOAfvxI.prxqd.cn
http://vblH4tfi.prxqd.cn
http://UBp40KFc.prxqd.cn
http://GXzfuqz5.prxqd.cn
http://qvyRfLik.prxqd.cn
http://q46vzD6n.prxqd.cn
http://c5mIwpH5.prxqd.cn
http://CxLRxP5m.prxqd.cn
http://259HkgfB.prxqd.cn
http://1eHQB84M.prxqd.cn
http://s8sGXvgg.prxqd.cn
http://jQ4FRQI4.prxqd.cn
http://oh16meaF.prxqd.cn
http://T0CTbQHb.prxqd.cn
http://tDIveu1F.prxqd.cn
http://2dQW2H9X.prxqd.cn
http://RkHa8IJi.prxqd.cn
http://YNsKq7fm.prxqd.cn
http://WGYrJA4u.prxqd.cn
http://QfZLHRUU.prxqd.cn
http://PeQCCbaY.prxqd.cn
http://gWyJof2F.prxqd.cn
http://ycpIGL6y.prxqd.cn
http://gqrbRuQu.prxqd.cn
http://BnJH40kU.prxqd.cn
http://UGH69e6E.prxqd.cn
http://QPHwMnlp.prxqd.cn
http://g0nspyng.prxqd.cn
http://AvWXl1Mr.prxqd.cn
http://xoYEVRnc.prxqd.cn
http://www.dtcms.com/a/377685.html

相关文章:

  • sql语句练习
  • 《深度学习的核心公式》
  • 划痕缺陷检测:3类成因,对应3套打光方案
  • 摆动序列:如何让数组“上下起伏”地最长?
  • 模型 公地悲剧
  • 深入理解 Android targetSdkVersion:从 Google Play 政策到依赖冲突
  • DDNS动态域名解析服务:原理与工具详解全攻略,外网畅访内网设备用自定义固定域名
  • 【系统分析师】第20章-关键技术:信息物理系统分析与设计(核心总结)
  • 批量更新数据:Mybatis update foreach 和 update case when 写法及比较
  • 九、瑞萨发布RZT/N认证的PROFINET-IRT和PROFIdrive软件协议栈
  • Linux系统学习之注意事项及命令基本格式
  • MoE架构训练系统设计:专家并行与门控网络优化策略
  • 深入分析神马 M56S+ 202T 矿机参数与性能特点
  • 工业RFID现场网关模块:实现多协议互通,128台读写设备互连!
  • Linux系统之----信号
  • 硅基计划4.0 算法 归并排序
  • 关于发布未来工业互联网基础理论与关键技术重大研究计划2025年度项目指南的通告
  • RAG技术解析:AI如何“边查边答”,还要守住数据安全底线?
  • 多通道相参信号
  • 数据映射表
  • NVSpeech_170k 数据集音频提取处理
  • GC Root的一些理解
  • Windows 使用 SHFileOperation 实现文件复制功能
  • Linux防火墙-Firewalld
  • 面壁智能开源多模态大模型——MiniCPM-V 4.5本地部署教程:8B参数开启多模态“高刷”时代!
  • vue3+TS项目配置Eslint+prettier+husky语法校验
  • Redis 5单线程 vs 6多线程性能解析
  • CSS 特指度 (Specificity)
  • 数据结构(C语言篇):(十一)二叉树概念介绍
  • 【go语言 | 第1篇】Go环境安装+go语言特性