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

Java 的 I/O 流是什么?

Java 的 I/O 流(Input/Output Stream)是 Java 中用于处理输入和输出操作的核心机制。它提供了一种统一的方式来读取和写入数据,无论数据源是文件、网络连接、内存还是其他设备。

I/O 流的基本概念

I/O 流可以看作是数据的流动管道:

  • 输入流:从数据源读取数据到程序中
  • 输出流:从程序写入数据到目标位置

I/O 流的分类体系

1.按数据流向分类

// 输入流 - 读取数据InputStream,Reader// 输出流 - 写入数据OutputStream,Writer

2.按数据类型分类

// 字节流 - 处理二进制数据(8位字节)InputStream,OutputStream// 字符流 - 处理文本数据(16位字符)Reader,Writer

主要 I/O 流类

字节流(Byte Streams)

InputStream 常用子类
FileInputStream// 从文件读取字节ByteArrayInputStream// 从字节数组读取BufferedInputStream// 带缓冲的输入流DataInputStream// 读取基本数据类型ObjectInputStream// 读取对象(序列化)
OutputStream 常用子类
FileOutputStream// 向文件写入字节ByteArrayOutputStream// 向字节数组写入BufferedOutputStream// 带缓冲的输出流DataOutputStream// 写入基本数据类型ObjectOutputStream// 写入对象(序列化)PrintStream// 格式化输出

字符流(Character Streams)

Reader 常用子类
FileReader// 从文件读取字符CharArrayReader// 从字符数组读取BufferedReader// 带缓冲的字符输入流InputStreamReader// 字节流到字符流的桥梁
Writer 常用子类
FileWriter// 向文件写入字符CharArrayWriter// 向字符数组写入BufferedWriter// 带缓冲的字符输出流OutputStreamWriter// 字符流到字节流的桥梁PrintWriter// 格式化字符输出

基本使用示例

1.文件复制(字节流)

try(InputStreamin=newFileInputStream("source.txt");OutputStreamout=newFileOutputStream("target.txt")){byte[]buffer=newbyte[1024];intbytesRead;while((bytesRead=in.read(buffer))!=-1){out.write(buffer,0,bytesRead);}}

2.文本文件读写(字符流)

// 读取文本文件try(BufferedReaderreader=newBufferedReader(newFileReader("input.txt"))){Stringline;while((line=reader.readLine())!=null){System.out.println(line);}}// 写入文本文件try(BufferedWriterwriter=newBufferedWriter(newFileWriter("output.txt"))){writer.write("Hello, World!");writer.newLine();writer.write("这是第二行");}

3.带缓冲的高效读写

// 高效文件复制try(BufferedInputStreambis=newBufferedInputStream(newFileInputStream("source.jpg"));BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream("target.jpg"))){byte[]buffer=newbyte[8192];// 8KB缓冲区intbytesRead;while((bytesRead=bis.read(buffer))!=-1){bos.write(buffer,0,bytesRead);}}

高级特性

1.装饰器模式

Java I/O 使用装饰器模式,可以灵活组合功能:

// 多层包装,每层添加不同功能DataInputStreamdis=newDataInputStream(newBufferedInputStream(newFileInputStream("data.bin")));

2.序列化与反序列化

// 对象序列化(写入)try(ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream("user.dat"))){Useruser=newUser("张三",25);oos.writeObject(user);}// 对象反序列化(读取)try(ObjectInputStreamois=newObjectInputStream(newFileInputStream("user.dat"))){Useruser=(User)ois.readObject();System.out.println(user.getName());}

3.NIO(New I/O)

Java NIO 提供了更高效的 I/O 操作:

// 使用 NIO 进行文件复制Pathsource=Paths.get("source.txt");Pathtarget=Paths.get("target.txt");Files.copy(source,target,StandardCopyOption.REPLACE_EXISTING);// 使用 Channel 和 Buffertry(FileChannelinChannel=FileChannel.open(source);FileChanneloutChannel=FileChannel.open(target,StandardOpenOption.CREATE,StandardOpenOption.WRITE)){ByteBufferbuffer=ByteBuffer.allocate(8192);while(inChannel.read(buffer)!=-1){buffer.flip();// 切换为读模式outChannel.write(buffer);buffer.clear();// 清空缓冲区}}

try-with-resources 自动资源管理

Java 7 引入的 try-with-resources 语法确保流正确关闭:

// 传统方式(需要手动关闭)FileInputStreamfis=null;try{fis=newFileInputStream("file.txt");// 使用流}finally{if(fis!=null){fis.close();// 必须手动关闭}}// try-with-resources(自动关闭)try(FileInputStreamfis=newFileInputStream("file.txt");FileOutputStreamfos=newFileOutputStream("output.txt")){// 使用流,自动关闭}

实际应用场景

1.配置文件读取

Propertiesprops=newProperties();try(InputStreamis=getClass().getResourceAsStream("/config.properties")){props.load(is);Stringurl=props.getProperty("database.url");}

2.网络通信

// 简单的 HTTP 客户端try(Socketsocket=newSocket("example.com",80);PrintWriterout=newPrintWriter(socket.getOutputStream(),true);BufferedReaderin=newBufferedReader(newInputStreamReader(socket.getInputStream()))){out.println("GET / HTTP/1.1");out.println("Host: example.com");out.println();Stringresponse;while((response=in.readLine())!=null){System.out.println(response);}}

3.数据加密传输

// 使用加密流try(CipherInputStreamcis=newCipherInputStream(newFileInputStream("encrypted.dat"),cipher);ObjectInputStreamois=newObjectInputStream(cis)){SecretDatadata=(SecretData)ois.readObject();}

性能优化建议

  1. 使用缓冲流BufferedInputStream/BufferedOutputStream提高性能
  2. 合理设置缓冲区大小:通常 4KB-8KB 为宜
  3. 及时关闭流:使用 try-with-resources 避免资源泄漏
  4. 考虑使用 NIO:对于高并发场景,NIO 性能更好
  5. 批量操作:尽量使用数组进行批量读写

总结

Java I/O 流的主要特点:

  • 统一的接口:所有 I/O 操作都基于流的概念
  • 灵活的扩展:通过装饰器模式组合不同功能
  • 类型安全:字节流和字符流明确区分
  • 资源管理:try-with-resources 确保资源正确释放
  • 高性能:缓冲机制和 NIO 提供高效操作

I/O 流是 Java 编程中不可或缺的基础组件,几乎所有的数据持久化和传输操作都依赖于它。

http://www.jsqmd.com/news/403312/

相关文章:

  • 航天器交会的分布式MPC模型预测控制研究附Matlab代码
  • Java 的 Optional 类是什么?它有什么用?
  • 如果一个线程在 Java 中被两次调用 start() 方法,会发生什么?
  • 图论——最短路Dijkstra算法
  • 2026年保健品推荐:品质与口碑并存,养胃颗粒/保健饮品/保健品,保健品品牌有哪些 - 品牌推荐师
  • [NOI2018] 冒泡排序
  • 通过MATLAB控制COMSOL Multiphysisc仿真进程模拟局部放电,建立有限元仿真模型
  • 【GLM-5 陪练式前端新手入门】第四篇:卡片布局 —— 让个人主页内容更有层次
  • Splay进阶
  • 【GLM-5 陪练式前端新手入门】第三篇:网页导航栏 —— 搭建个人主页的 “指路牌”
  • [AI提效-17]-豆包图片生成功能新手入门指南
  • 写一个自动检测照片光线构图,给出优化建议,颠覆拍照全靠盲拍。
  • Python基于Vue的 古城景区管理系统的设计与实现django flask pycharm
  • 视频孪生平台之上:镜像视界三维实时解算体系在危化园区风险半径动态解算中的全球领先性研究
  • 2134523
  • 5784784
  • 深度解读:Android开发工程师岗位核心能力与技术进阶之路——以苏州池久节能电气有限公司职位要求为例
  • 苏州智观易盛信息科技有限公司 Android 开发工程师职位深度解析与面试全攻略
  • AI 2.0提示工程架构师:提示词调试与优化的9个实用工具
  • 大数据领域日志数据压缩算法的比较与选择
  • Zookeeper为大数据领域分布式计算带来的优势
  • 解决推荐同质化!Agentic AI提示工程在个性化推荐系统中的创新应用
  • 顶极模型大比拼,到底谁才是真正的编程之王?
  • AI应用架构师与科研数据AI分析工具的协同作战
  • 0222cursor日志
  • 大数据领域分布式存储的扩展性设计思路
  • Python json write serialized content to json file
  • 【脑洞编程】从“治国理政”看懂C++广播机制:全局变量的“中央集权”与“局部自治”
  • 设计一个电商平台的购物车系统。
  • C++ 多线程与并发系统取向(二)—— 资源保护:std::mutex 与 RAII(类比 Java synchronized)