活动介绍

Java经典I/O操作全解析

立即解锁
发布时间: 2025-08-19 00:10:24 阅读量: 14 订阅数: 28
PDF

深入浅出Java与Android开发

### Java经典I/O操作全解析 在Java编程中,I/O操作是非常重要的一部分,它涉及到数据的读写、对象的序列化与反序列化等多个方面。下面将详细介绍Java经典I/O操作的相关知识。 #### 1. 对象反序列化机制 在反序列化一个对象之前,反序列化机制会先检查对象的类是否实现了`Externalizable`接口。具体流程如下: ```mermaid graph TD; A[开始反序列化] --> B{类是否实现Externalizable接口}; B -- 是 --> C[通过公共无参构造函数实例化类]; C -- 成功 --> D[调用readExternal()方法]; B -- 否 --> E{是否存在private readObject(ObjectInputStream)方法}; E -- 是 --> F[调用readObject()方法]; E -- 否 --> G[执行默认反序列化,仅包含非瞬态实例字段]; ``` - **实现`Externalizable`接口**:如果类实现了该接口,机制会尝试通过公共无参构造函数实例化类,若成功则调用`readExternal()`方法。 - **未实现`Externalizable`接口**:机制会查找`private readObject(ObjectInputStream)`方法,若该方法不存在,则执行默认反序列化,只包含非瞬态实例字段。 #### 2. PrintStream类 `PrintStream`类在Java的流类中比较特殊,从命名规范上看,它本应被命名为`PrintOutputStream`。以下是它的一些特点: - **功能**:该类是一个过滤输出流类,它将输入数据项的字符串表示写入底层输出流。 - **字符编码**:使用默认字符编码将字符串的字符转换为字节。由于它不支持不同的字符编码,建议使用等效的`PrintWriter`类,但在处理`System.out`和`System.err`时,需要了解`PrintStream`,因为这两个类字段的类型是`PrintStream`。 - **`print()`和`println()`方法**:`PrintStream`实例有各种`print()`和`println()`方法,用于将整数、浮点值和其他数据项的字符串表示打印到底层输出流。`println()`方法与`print()`方法不同,它会在输出后追加一个行终止符。行终止符不一定是换行符,为了提高可移植性,行分隔符是由系统属性`line.separator`定义的字符序列。例如,在Windows平台上,`System.getProperty("line.separator")`返回实际的回车符(13,符号表示为`\r`),后跟实际的换行符(10,符号表示为`\n`);而在Unix和Linux平台上,只返回实际的换行符。 - **其他特性**: - 与其他输出流不同,打印流不会重新抛出底层输出流抛出的`IOException`实例,而是设置一个内部标志,可以通过调用`PrintStream`的`boolean checkError()`方法进行测试,若返回`true`则表示有问题。 - 可以创建`PrintStream`对象,使其自动将输出刷新到底层输出流。即写入字节数组、调用`println()`方法之一或写入换行符后,会自动调用`flush()`方法。`System.out`和`System.err`分配的`PrintStream`实例会自动将输出刷新到底层输出流。 - `PrintStream`声明了`PrintStream format(String format, Object... args)`方法用于实现格式化输出,还声明了`printf(String format, Object... args)`便利方法,它委托给`format()`方法。例如,`out.printf(format, args)`与`out.format(format, args)`调用效果相同。 **注意事项**:切勿在要通过`print()`或`println()`方法输出的字符串字面量中硬编码`\n`转义序列,这样做不具有可移植性。当需要输出空行时,最简单的方法是调用`System.out.println()`。 #### 3. 字符集和字符编码的历史 早期计算机和编程语言主要由英语国家的英语程序员创建,他们开发了`ASCII`字符集/编码,它定义了代码点0到127与英语中128个常用字符的标准映射。但`ASCII`对于大多数非英语语言来说是不够的,例如它不支持法语中的变音符号。由于一个字节最多可以表示256个不同的字符,世界各地的开发者开始创建不同的字符集/编码,这些编码包含了128个`ASCII`字符,还额外编码了满足法语、希腊语或俄语等语言需求的字符。 国际标准化组织(ISO)和国际电工委员会(IEC)努力将这些8位字符集/编码标准化,形成了`ISO/IEC 8859`系列子标准,如`ISO/IEC 8859 - 1`(也称为`Latin - 1`),它定义了包含`ASCII`以及涵盖大多数西欧国家字符的字符集/编码;`ISO/IEC 8859 - 2`(也称为`Latin - 2`)定义了涵盖中欧和东欧国家的类似字符集/编码。 然而,尽管有这些努力,众多的字符集/编码仍然存在不足,例如大多数字符集/编码只允许创建英语和另一种语言(或少数其他语言)组合的文档,无法使用`ISO/IEC`字符集/编码创建包含英语、法语、土耳其语、俄语和希腊语字符组合的文档。 为了解决这些问题,国际社会创建并不断发展了`Unicode`,它是一个单一的通用字符集。由于`Unicode`字符比`ISO/IEC`字符大,`Unicode`使用几种可变长度编码方案之一,即`Unicode Transformation Format (UTF)`来高效编码`Unicode`字符。例如,`UTF - 8`用1到4个字节对`Unicode`字符集中的每个字符进行编码,并且与`ASCII`向后兼容。 在`ISO/IEC`字符集的上下文中,字符集和字符编码这两个术语通常可以互换使用,因为代码点就是编码;但在`Unicode`的上下文中,`Unicode`是字符集,`UTF - 8`是`Unicode`字符的几种可能的字符编码之一。 #### 4. Writer和Reader类概述 Java的流类适合处理字节序列,但不适合处理字符序列,因为字节和字符是不同的概念,字节表示8位数据项,而字符表示16位数据项。此外,Java的`char`和`String`类型自然地处理字符而非字节,而且字节流对字符集(整数值与符号之间的映射集,如`Unicode`)及其字符编码(字符集成员与字节序列之间的映射,如`UTF - 8`)一无所知。 如果需要处理字符流,应该利用Java的`writer`和`reader`类,它们专为支持字符I/O而设计(处理`char`而非`byte`),并且考虑了字符编码。 `java.io`包提供了几个`writer`和`reader`类,它们是抽象类`Writer`和`Reader`的子类。以下是`writer`和`reader`类的层次结构: | 类型 | 子类 | | ---- | ---- | | `Writer` | `BufferedWriter`、`CharArrayWriter`、`OutputStreamWriter`、`PipedWriter`、`PrintWriter`、`StringWriter`、`FileWriter`、`FilterWriter`(抽象) | | `Reader` | `BufferedReader`、`CharArrayReader`、`InputStreamReader`、`PipedReader`、`PushbackReader`、`FileReader`、`StringReader`、`LineNumberReader`、`FilterReader`(抽象) | 虽然`writer`和`reader`类的层次结构与输出流和输入流的对应结构相似,但也存在差异。例如,`FilterWriter`和`FilterReader`是抽象的,而它们对应的`FilterOutputStream`和`FilterInputStream`不是抽象的;`BufferedWriter`和`BufferedReader`不扩展`FilterWriter`和`FilterReader`,而`BufferedOutputStream`和`BufferedInputStream`扩展`FilterOutputStream`和`FilterInputStream`。这一设计变化可能与性能有关,因为文件I/O活动(如将一个文件复制到另一个文件)可能涉及许多`write()`/`read()`方法调用,不子类化`FilterWriter`和`FilterReader`可以使`BufferedWriter`和`BufferedReader`获得更好的性能。 #### 5. Writer和Reader类的具体介绍 - **Writer类**:是所有`writer`子类的超类,与`OutputStream`相比,有以下不同: - 声明了几个`append()`方法,用于将字符追加到`writer`中。这是因为`Writer`实现了`java.lang.Appendable`接口,该接口与`Formatter`类(用于输出格式化字符串)配合使用。 - 声明了额外的`write()`方法,包括一个方便的`void write(String str)`方法,用于将`String`对象的字符写入`writer`。 - **Reader类**:是所有`reader`子类的超类,与`InputStream`相比,有以下不同: - 声明了`read(char[])`和`read(char[], int, int)`方法,而不是`read(byte[])`和`read(byte[], int, int)`方法。 - 没有声明`available()`方法。 - 声明了一个`boolean ready()`方法,当保证下一次`read()`调用不会阻塞输入时返回`true`。 - 声明了一个`int read(CharBuffer target)`方法,用于从字符缓冲区读取字符。 #### 6. OutputStreamWriter和InputStreamReader类 - **OutputStreamWriter类**:是一个具体的`Writer`子类,它是输入字符序列和输出字节流之间的桥梁。写入该`writer`的字符根据默认或指定的字符编码被编码为字节。默认字符编码可以通过系统属性`file.encoding`访问。每次调用`OutputStreamWriter`的`write()`方法时,会调用编码器对给定的字符进行编码,生成的字节在写入底层输出流之前会先累积在一个缓冲区中,但传递给`write()`方法的字符不会被缓冲。 - **构造函数**: - `OutputStreamWriter(OutputStream out)`:创建一个输入字符序列(通过`append()`和`write()`方法传递给`OutputStreamWriter`)和底层输出流`out`之间的桥梁,使用默认字符编码将字符编码为字节。 - `OutputStreamWriter(OutputStream out, String charsetName)`:创建一个输入字符序列和底层输出流`out`之间的桥梁,`charsetName`指定用于将字符编码为字节的字符编码。如果指定的字符编码不受支持,该构造函数会抛出`java.io.UnsupportedEncodingException`。 - **示例代码**: ```java import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; public class OutputStreamWriterExample { public static void main(Strin ```
corwn 最低0.47元/天 解锁专栏
赠100次下载
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

陆鲁

资深技术专家
超过10年工作经验的资深技术专家,曾在多家知名大型互联网公司担任重要职位。任职期间,参与并主导了多个重要的移动应用项目。
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看
立即解锁

专栏目录

最新推荐

区块链集成供应链与医疗数据管理系统的优化研究

# 区块链集成供应链与医疗数据管理系统的优化研究 ## 1. 区块链集成供应链的优化工作 在供应链管理领域,区块链技术的集成带来了诸多优化方案。以下是近期相关优化工作的总结: | 应用 | 技术 | | --- | --- | | 数据清理过程 | 基于新交叉点更新的鲸鱼算法(WNU) | | 食品供应链 | 深度学习网络(长短期记忆网络,LSTM) | | 食品供应链溯源系统 | 循环神经网络和遗传算法 | | 多级供应链生产分配(碳税政策下) | 混合整数非线性规划和分布式账本区块链方法 | | 区块链安全供应链网络的路线优化 | 遗传算法 | | 药品供应链 | 深度学习 | 这些技

探索人体与科技融合的前沿:从可穿戴设备到脑机接口

# 探索人体与科技融合的前沿:从可穿戴设备到脑机接口 ## 1. 耳部交互技术:EarPut的创新与潜力 在移动交互领域,减少界面的视觉需求,实现无视觉交互是一大挑战。EarPut便是应对这一挑战的创新成果,它支持单手和无视觉的移动交互。通过触摸耳部表面、拉扯耳垂、在耳部上下滑动手指或捂住耳朵等动作,就能实现不同的交互功能,例如通过拉扯耳垂实现开关命令,上下滑动耳朵调节音量,捂住耳朵实现静音。 EarPut的应用场景广泛,可作为移动设备的遥控器(特别是在播放音乐时)、控制家用电器(如电视或光源)以及用于移动游戏。不过,目前EarPut仍处于研究和原型阶段,尚未有商业化产品推出。 除了Ea

从近似程度推导近似秩下界

# 从近似程度推导近似秩下界 ## 1. 近似秩下界与通信应用 ### 1.1 近似秩下界推导 通过一系列公式推导得出近似秩的下界。相关公式如下: - (10.34) - (10.37) 进行了不等式推导,其中 (10.35) 成立是因为对于所有 \(x,y \in \{ -1,1\}^{3n}\),有 \(R_{xy} \cdot (M_{\psi})_{x,y} > 0\);(10.36) 成立是由于 \(\psi\) 的平滑性,即对于所有 \(x,y \in \{ -1,1\}^{3n}\),\(|\psi(x, y)| > 2^d \cdot 2^{-6n}\);(10.37) 由

量子物理相关资源与概念解析

# 量子物理相关资源与概念解析 ## 1. 参考书籍 在量子物理的学习与研究中,有许多经典的参考书籍,以下是部分书籍的介绍: |序号|作者|书名|出版信息|ISBN| | ---- | ---- | ---- | ---- | ---- | |[1]| M. Abramowitz 和 I.A. Stegun| Handbook of Mathematical Functions| Dover, New York, 1972年第10次印刷| 0 - 486 - 61272 - 4| |[2]| D. Bouwmeester, A.K. Ekert, 和 A. Zeilinger| The Ph

人工智能与混合现实技术在灾害预防中的应用与挑战

### 人工智能与混合现实在灾害预防中的应用 #### 1. 技术应用与可持续发展目标 在当今科技飞速发展的时代,人工智能(AI)和混合现实(如VR/AR)技术正逐渐展现出巨大的潜力。实施这些技术的应用,有望助力实现可持续发展目标11。该目标要求,依据2015 - 2030年仙台减少灾害风险框架(SFDRR),增加“采用并实施综合政策和计划,以实现包容、资源高效利用、缓解和适应气候变化、增强抗灾能力的城市和人类住区数量”,并在各级层面制定和实施全面的灾害风险管理。 这意味着,通过AI和VR/AR技术的应用,可以更好地规划城市和人类住区,提高资源利用效率,应对气候变化带来的挑战,增强对灾害的

由于提供的内容仅为“以下”,没有具体的英文内容可供翻译和缩写创作博客,请你提供第38章的英文具体内容,以便我按照要求完成博客创作。

由于提供的内容仅为“以下”,没有具体的英文内容可供翻译和缩写创作博客,请你提供第38章的英文具体内容,以便我按照要求完成博客创作。 请你提供第38章的英文具体内容,同时给出上半部分的具体内容(目前仅为告知无具体英文内容需提供的提示),这样我才能按照要求输出下半部分。

元宇宙与AR/VR在特殊教育中的应用及安全隐私问题

### 元宇宙与AR/VR在特殊教育中的应用及安全隐私问题 #### 元宇宙在特殊教育中的应用与挑战 元宇宙平台在特殊教育发展中具有独特的特性,旨在为残疾学生提供可定制、沉浸式、易获取且个性化的学习和发展体验,从而改善他们的学习成果。然而,在实际应用中,元宇宙技术面临着诸多挑战。 一方面,要确保基于元宇宙的技术在设计和实施过程中能够促进所有学生的公平和包容,避免加剧现有的不平等现象和强化学习发展中的偏见。另一方面,大规模实施基于元宇宙的特殊教育虚拟体验解决方案成本高昂且安全性较差。学校和教育机构需要采购新的基础设施、软件及VR设备,还会产生培训、维护和支持等持续成本。 解决这些关键技术挑

黎曼zeta函数与高斯乘性混沌

### 黎曼zeta函数与高斯乘性混沌 在数学领域中,黎曼zeta函数和高斯乘性混沌是两个重要的研究对象,它们之间存在着紧密的联系。下面我们将深入探讨相关内容。 #### 1. 对数相关高斯场 在研究中,我们发现协方差函数具有平移不变性,并且在对角线上存在对数奇异性。这种具有对数奇异性的随机广义函数在高斯过程的研究中被广泛关注,被称为高斯对数相关场。 有几个方面的证据表明临界线上$\log(\zeta)$的平移具有对数相关的统计性质: - 理论启发:从蒙哥马利 - 基廷 - 斯奈思的观点来看,在合适的尺度上,zeta函数可以建模为大型随机矩阵的特征多项式。 - 实际研究结果:布尔加德、布

利用GeoGebra增强现实技术学习抛物面知识

### GeoGebra AR在数学学习中的应用与效果分析 #### 1. 符号学视角下的学生学习情况 在初步任务结束后的集体讨论中,学生们面临着一项挑战:在不使用任何动态几何软件,仅依靠纸和笔的情况下,将一些等高线和方程与对应的抛物面联系起来。从学生S1的发言“在第一个练习的图形表示中,我们做得非常粗略,即使现在,我们仍然不确定我们给出的答案……”可以看出,不借助GeoGebra AR或GeoGebra 3D,识别抛物面的特征对学生来说更为复杂。 而当提及GeoGebra时,学生S1表示“使用GeoGebra,你可以旋转图像,这很有帮助”。学生S3也指出“从上方看,抛物面与平面的切割已经

使用GameKit创建多人游戏

### 利用 GameKit 创建多人游戏 #### 1. 引言 在为游戏添加了 Game Center 的一些基本功能后,现在可以将游戏功能扩展到支持通过 Game Center 进行在线多人游戏。在线多人游戏可以让玩家与真实的人对战,增加游戏的受欢迎程度,同时也带来更多乐趣。Game Center 中有两种类型的多人游戏:实时游戏和回合制游戏,本文将重点介绍自动匹配的回合制游戏。 #### 2. 请求回合制匹配 在玩家开始或加入多人游戏之前,需要先发出请求。可以使用 `GKTurnBasedMatchmakerViewController` 类及其对应的 `GKTurnBasedMat