io流 知识汇总

本文深入探讨Java的I/O操作类,包括字节流、字符流、磁盘和网络I/O接口,解析I/O核心问题及其对效率的影响,并介绍如何使用available()方法获取流中剩余字节数。

2020年4月5号
一个文件在同一时间只能被一个线程读写

19/10/27
https://blog.youkuaiyun.com/sinat_33921105/article/details/81081452
io流讲解

https://www.cnblogs.com/yoke/p/7440669.html 流及应用

2020.3.28
https://www.ibm.com/developerworks/cn/java/j-lo-javaio/index.html

Java 的 I/O 操作类在包 java.io 下,大概有将近 80 个类,但是这些类大概可以分成四组,分别是:

基于字节操作的 I/O 接口:InputStream 和 OutputStream
基于字符操作的 I/O 接口:Writer 和 Reader
基于磁盘操作的 I/O 接口:File
基于网络操作的 I/O 接口:Socket
前两组主要是根据传输数据的数据格式,后两组主要是根据传输数据的方式,虽然 Socket 类并不在 java.io 包下,但是我仍然把它们划分在一起,因为我个人认为 I/O 的核心问题要么是数据格式影响 I/O 操作,要么是传输方式影响 I/O 操作,也就是将什么样的数据写到什么地方的问题,I/O 只是人与机器或者机器与机器交互的手段,除了在它们能够完成这个交互功能外,我们关注的就是如何提高它的运行效率了,而数据格式和传输方式是影响效率最关键的因素了。我们后面的分析也是基于这两个因素来展开的。

2020/6/10
available() 可以读取流中剩下的字节长度。

### Java IO知识体系总结 Java IO(Input/Output)是Java语言中用于处理数据输入输出的核心机制。它提供了一套灵活且强大的API,能够满足不同场景下的数据读写需求。以下是Java IO知识体系总结: #### 1. Java IO的特点 Java IO具有以下特点: - **面向**:所有输入输出操作都通过来完成。 - **灵活性**:支持多种数据源和目标,如文件、网络连接、内存等。 - **层次化设计**:通过装饰器模式实现功能扩展,例如缓冲、转换等功能[^3]。 #### 2. Java IO的分类 Java IO主要分为两大类: - **字节(Byte Stream)**:以字节为单位进行数据读写,适用于处理二进制数据。常见的类包括`FileInputStream`和`FileOutputStream`[^2]。 - **字符(Character Stream)**:以字符为单位进行数据读写,适用于处理文本数据。常见的类包括`FileReader`和`FileWriter`[^2]。 #### 3. 字节与字符的关系与区别 - **关系**:字符基于字节实现,通过`InputStreamReader`和`OutputStreamWriter`将字节转换为字符[^2]。 - **区别**: - 数据单位不同:字节处理8位字节,字符处理16位Unicode字符[^5]。 - 编码方式不同:字节不涉及编码问题,而字符需要指定字符集编码(如UTF-8、GBK)。 #### 4. 缓冲的作用与效率 - **缓冲**:通过引入缓冲区减少底层I/O操作次数,从而提高性能。常见的缓冲包括`BufferedInputStream`、`BufferedOutputStream`、`BufferedReader`和`BufferedWriter`[^4]。 - **效率分析**:缓冲不一定总是高效,其性能取决于缓冲区大小和具体应用场景。如果数据量较小或缓冲区设置不合理,可能会导致额外开销。 #### 5. 缓冲的设计模式思想 缓冲体现了Java中的**装饰器模式**。通过在已有的基础上添加缓冲功能,实现了功能的动态扩展,同时保持了代码的可复用性和灵活性。 #### 6. 序列化的意义与实现 - **意义**:序列化是将对象的状态转换为字节的过程,便于在网络中传输或存储到文件中。反序列化则是将字节恢复为对象的过程[^1]。 - **实现方式**: - 对象类需实现`Serializable`接口。 - 使用`ObjectOutputStream`进行序列化,`ObjectInputStream`进行反序列化。 #### 7. 序列化后修改类文件的问题及解决方法 如果序列化后修改了类文件,可能导致反序列化失败。解决方法包括: - 在类中显式定义`serialVersionUID`,确保版本一致性。 - 避免修改影响序列化的字段(如删除或更改字段类型)[^1]。 #### 示例代码 以下是一个简单的文件读写示例,展示了字节和字符的使用: ```java // 字节写入 try (FileOutputStream fos = new FileOutputStream("test.txt")) { String content = "Hello, Java IO!"; fos.write(content.getBytes()); } catch (IOException e) { e.printStackTrace(); } // 字符读取 try (FileReader fr = new FileReader("test.txt"); BufferedReader br = new BufferedReader(fr)) { StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) { sb.append(line); } System.out.println(sb.toString()); } catch (IOException e) { e.printStackTrace(); } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值