IO流整理

本文介绍了Java中的IO流,包括为什么需要IO流来实现数据持久化,以及流的两大分类——字节流和字符流。字节流主要用于处理字节和二进制数据,而字符流则适用于字符和文本数据。输入流是从外部源读取数据到内存,输出流则是将数据从内存写出到外部目的地。理解IO流对于进行文件操作、网络传输等至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IO流体系结构图
在这里插入图片描述
IO流的引入
我们知道将数据保存到变量中,集合等内存区域,但是这样存在一个弊端,就是程序一旦结束,数据就会立刻消失,无法做到数据的持久化存储。
如何做到数据的持久化呢?
数据从内存写入文件系统做到持久化
如何将数据写入呢?
Java提供了IO流(输入输出流)
流:观察生活中的水流、物流等,描述一下数据流的概念。
IO流概述
在程序中所有的数据都是以流的方式进行传输或保存的,程序通过输入流读取数据;当程序需要将一些数据长期保存起来的时候使用输出流完成。
例如:本地文件拷贝,上传文件和下载文件等等。
注意:
1、但凡是对数据的操作,Java都是通过流的方式来操作的。
2、程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。
3、IO流可以做到数据的持久化,但是IO流本质上是用来处理本地文件系统以及不同设备之间的数据传输。
IO流分类
按照数据流向
输入流:从外界(键盘、网络、文件…)读取数据到内存
输出流:用于将程序中的数据写出到外界(显示器、文件…)
数据源 目的地 交通工具
按照数据类型
字节流:主要用来处理字节或二进制对象。
字节输入流(InputStream)
字节输出流 (OutputStream)
字符流:主要用来处理字符、字符数组或字符串。
字符输入流(Reader)
字符输出流(Writer)
字节流和字符流的区别:(重点)

读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

选取:只要是处理纯文本数据,就优先考虑使用字符流,除此之外都使用字节流。
### Java IO使用总结 Java IO(Input/Output)用于处理设备之间的数据传输。它主要分为字节和字符两大类,每种又可以进一步划分为输入和输出。 #### 1. 字节 字节继承自`InputStream`和`OutputStream`两个抽象基类。它们以8位字节为单位进行数据读取或写入操作。 - **FileInputStream/FileOutputStream**: 基本的文件读写功能。 ```java try (FileOutputStream fos = new FileOutputStream("output.txt")) { fos.write("Hello, world!".getBytes()); } catch (Exception e) { e.printStackTrace(); } ``` - **DataInputStream/DataOutputStream**: 提供对基本数据类型的读写支持[^1]。 ```java try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.dat"))) { dos.writeInt(123); dos.writeDouble(456.789); } catch (Exception e) { e.printStackTrace(); } ``` #### 2. 字符 字符继承自`Reader`和`Writer`两个抽象基类。它们以16位Unicode字符为单位进行数据读取或写入操作。 - **FileReader/FileWriter**: 文件字符读写的基础实现。 ```java try (FileWriter fw = new FileWriter("char_output.txt")) { fw.write("你好,世界!"); } catch (Exception e) { e.printStackTrace(); } ``` - **BufferedReader/BufferedWriter**: 添加缓冲机制,提高性能。 ```java try (BufferedWriter bw = new BufferedWriter(new FileWriter("buffered_output.txt"))) { bw.write("带缓冲区的写入"); } catch (Exception e) { e.printStackTrace(); } ``` #### 3. 转换 转换用于解决不同编码间的转换问题。 - **InputStreamReader/OutputStreamWriter**: 实现字节与字符之间的转换[^4]。 ```java try (OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("utf8_file.txt"), "UTF-8")) { osw.write("这是一个UTF-8编码的字符串"); } catch (Exception e) { e.printStackTrace(); } ``` #### 4. 序列化与反序列化 序列化是指将对象的状态保存到存储介质中;而反序列化则是指从存储介质中恢复对象状态的过程。 - **ObjectOutputStream/ObjectInputStream**: 处理对象的序列化与反序列化[^3]。 ```java // 序列化 try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.ser"))) { oos.writeObject("测试字符串"); } catch (Exception e) { e.printStackTrace(); } // 反序列化 try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.ser"))) { String str = (String) ois.readObject(); System.out.println(str); } catch (Exception e) { e.printStackTrace(); } ``` #### 5. 文件管理 通过`File`类可方便地管理和查询文件属性以及执行简单的目录遍历等操作[^2]。 ```java File file = new File("/path/to/somefile.txt"); if (file.exists()) { System.out.println("文件名:" + file.getName()); } ``` --- ### 总结 以上是对Java IO的主要分类及其典型应用场景的一个概述。无论是简单的小型应用还是复杂的大型项目开发过程中,合理选用合适的IO方式能够显著提升程序效率并简化代码逻辑结构设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值