【Java学习笔记】I/O

本文为您介绍了Java中常用的输入输出流,包括字符流和字节流的分类与使用,详细解释了Reader、Writer、InputStream、OutputStream等类的功能与用途,强调了使用BufferedReader、BufferedWriter和FileReader、FileWriter的效率提升。同时讨论了文件操作、网络操作等高级应用,并对Java I/O操作进行了全面总结。

-----------------------------------------------个人初学,如有错误,欢迎指正-----------------------------------------------

Java I/O初学笔记


先来看一张I/O的体系图吧:


一、简介

I/O简而言之就是各种媒介之间进行数据交换。本文主要介绍Java中常用的输入输出流。Java的I/O包中Stream类根据操作的对象分为字符流和字节流。


二、分类

Java的I/O操作,主要可以分为下面四类:

1、字符流:Reader(读),Writer(写);参见上图右半部分

2、字节流:InputStream(输入流),OutputStream(输出流);参见上图左半部分

3、盘符:File(文件类)

4、网络:Socket(位于java.net包下,不在java.io里)


三、详细介绍

3.1字符流

Reader和Writer都是抽象类,具体的读写操作可以使用已经实现的FileReader和FileWriter两个子类。还有两个已经实现的带缓冲区的子类BufferedReader和BufferedWriter,我们来看看官方API是怎么介绍的:

公共类BufferedReader继承自Reader。

从字符输入流中读取文本信息,字符缓冲区用来高效读取字符,数组,行。缓冲区的大小可能被设定,或者默认的大小可供使用。缓冲区的默认大小足够大部分情况使用了。

一般的,每次读请求都会在底层生成相应的字符或字节流读请求对象,因此,对于用FileReaders和InputStreamReaders等消耗较高的操作,使用其他Reader对象包裹BufferedReder是很明智的。


公共类BufferedWriter继承自Writer

从字符输流中写入文本信息,字符缓冲区用来高效写入字符,数组,行。缓冲区的大小可能被设定,或者默认的大小可供使用。缓冲区的默认大小足够大部分情况使用了。

newLine()方法是根据所运行的平台自身定义的行终止符来定义的一行的终止,并不是所有的平台都使用“\n”来作为一行的结束。因此使用newLine()来结束一行的输出,要比直接使用“\n”好。

一般的,除非有输出提示,writer对象会立即输出基本字符或字节。对于用FileWriters和OutputStreamWriters等消耗较高的操作,使用其他Reader对象包裹BufferedWriter是很明智的。

通过API我们可以很直接的了解到,FileReader和FileWriter配合BufferedReder和BufferedWriter效率会更高。


3.2字节流

InputStream和OutputStream是字节流的两个父类,也都是抽象类。同字符流一样,字节流也提供了两个常用的以实现的子类FileInputStream和FilieOutputStream来读取文件。我们查看API的介绍:

公共类FileInputStream继承自InputStream

FileInputStream对象从系统的一个文件中获取字节到另一个文件。文件是否可用,取决于系统的环境。

FileInputStream主要用来读取字节流,比如图片数据。如果要读取字符,可以考虑使用FileReader。


公共类FileOutputStream继承自OutputStream

文件输出流是写入数据到文件或者文件说明符中的一种输出流。无论一个文件是否可用或者可能被创建则取决于运行的平台。特别的,一些平台在一定时间内只允许一个FileOutputStream对象(或其它文件写入对象)打开一个文件以供写入。在这种情况下,如果一个文件已经被打开,那么FileOutputStream类的构造函数将会失败。

FileOutputStream主要用来写入字节流,比如图片数据。如果要写入字符,可以考虑使用FileWriterr。

字节流的两个子类都有提示,如果要读写字符数据,建议使用字符流。这是因为一个字符占两个字节,如果是文本文档,那么使用字节流,读写两次才可以读完一个汉字,但是字符流一次就可以读写一个字符,加上字符流可以配合BufferedReder和BufferedWriter使用,所以效率会比字节流高很多。同样的,图片和视频等数据是以二进制字节存储的,所以使用字节流读写图片等数据会更方便。


四、小结

字节流以字节为单位读取数据,字符流以字符为单位读取数据。Java的I/O主要有两个超类:inputstream和outputstream字节流类,以及Reader和Writer字符流类。

字节流和字符流之间通过 InputStreamReader和OutputStreamWriter来转换,也就是通过byte数组(字节)和String(字符)来关联,也可以理解为字节和字符之间转换。


今天主要都是理论部分,明天补充代码实例。文章如有错误,欢迎指正。


AI 代码审查Review工具 是一个旨在自动化代码审查流程的工具。它通过集成版本控制系统(如 GitHub 和 GitLab)的 Webhook,利用大型语言模型(LLM)对代码变更进行分析,并将审查意见反馈到相应的 Pull Request 或 Merge Request 中。此外,它还支持将审查结果通知到企业微信等通讯工具。 一个基于 LLM 的自动化代码审查助手。通过 GitHub/GitLab Webhook 监听 PR/MR 变更,调用 AI 分析代码,并将审查意见自动评论到 PR/MR,同时支持多种通知渠道。 主要功能 多平台支持: 集成 GitHub 和 GitLab Webhook,监听 Pull Request / Merge Request 事件。 智能审查模式: 详细审查 (/github_webhook, /gitlab_webhook): AI 对每个变更文件进行分析,旨在找出具体问题。审查意见会以结构化的形式(例如,定位到特定代码行、问题分类、严重程度、分析和建议)逐条评论到 PR/MR。AI 模型会输出 JSON 格式的分析结果,系统再将其转换为多条独立的评论。 通用审查 (/github_webhook_general, /gitlab_webhook_general): AI 对每个变更文件进行整体性分析,并为每个文件生成一个 Markdown 格式的总结性评论。 自动化流程: 自动将 AI 审查意见(详细模式下为多条,通用模式下为每个文件一条)发布到 PR/MR。 在所有文件审查完毕后,自动在 PR/MR 中发布一条总结性评论。 即便 AI 未发现任何值得报告的问题,也会发布相应的友好提示和总结评论。 异步处理审查任务,快速响应 Webhook。 通过 Redis 防止对同一 Commit 的重复审查。 灵活配置: 通过环境变量设置基
【直流微电网】径向直流微电网的状态空间建模与线性化:一种耦合DC-DC变换器状态空间平均模型的方法 (Matlab代码实现)内容概要:本文介绍了径向直流微电网的状态空间建模与线性化方法,重点提出了一种基于耦合DC-DC变换器的状态空间平均模型的建模策略。该方法通过数学建模手段对直流微电网系统进行精确的状态空间描述,并对其进行线性化处理,以便于系统稳定性分析与控制器设计。文中结合Matlab代码实现,展示了建模与仿真过程,有助于研究人员理解和复现相关技术,推动直流微电网系统的动态性能研究与工程应用。; 适合人群:具备电力电子、电力系统或自动化等相关背景,熟悉Matlab/Simulink仿真工具,从事新能源、微电网或智能电网研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握直流微电网的动态建模方法;②学习DC-DC变换器在耦合条件下的状态空间平均建模技巧;③实现系统的线性化分析并支持后续控制器设计(如电压稳定控制、功率分配等);④为科研论文撰写、项目仿真验证提供技术支持与代码参考。; 阅读建议:建议读者结合Matlab代码逐步实践建模流程,重点关注状态变量选取、平均化处理和线性化推导过程,同时可扩展应用于更复杂的直流微电网拓扑结构中,提升系统分析与设计能力。
内容概要:本文介绍了基于物PINN驱动的三维声波波动方程求解(Matlab代码实现)理信息神经网络(PINN)求解三维声波波动方程的Matlab代码实现方法,展示了如何利用PINN技术在无需大量标注数据的情况下,结合物理定律约束进行偏微分方程的数值求解。该方法将神经网络与物理方程深度融合,适用于复杂波动问题的建模与仿真,并提供了完整的Matlab实现方案,便于科研人员理解和复现。此外,文档还列举了多个相关科研方向和技术服务内容,涵盖智能优化算法、机器学习、信号处理、电力系统等多个领域,突出其在科研仿真中的广泛应用价值。; 适合人群:具备一定数学建模基础和Matlab编程能力的研究生、科研人员及工程技术人员,尤其适合从事计算物理、声学仿真、偏微分方程数值解等相关领域的研究人员; 使用场景及目标:①学习并掌握PINN在求解三维声波波动方程中的应用原理与实现方式;②拓展至其他物理系统的建模与仿真,如电磁场、热传导、流体力学等问题;③为科研项目提供可复用的代码框架和技术支持参考; 阅读建议:建议读者结合文中提供的网盘资源下载完整代码,按照目录顺序逐步学习,重点关注PINN网络结构设计、损失函数构建及物理边界条件的嵌入方法,同时可借鉴其他案例提升综合仿真能力。
Java 基础知识中,I/O 操作是程序与外部世界进行交互的重要方式。Java I/O(输入/输出)主要通过流(Stream)实现,分为字节流和字符流两大类。以下是关于 Java I/O 操作的学习笔记总结: ### 字节流与字符流 Java 的 I/O 操作可以分为基于字节的流(InputStream 和 OutputStream)和基于字符的流(Reader 和 Writer)。字节流适用于处理二进制文件,如图片、音频等,而字符流更适合于文本数据的读写。 #### 示例:使用 `FileReader` 和 `FileWriter` 实现字符流复制 ```java try (FileReader reader = new FileReader("input.txt"); FileWriter writer = new FileWriter("output.txt")) { int charData; while ((charData = reader.read()) != -1) { writer.write(charData); } } catch (IOException e) { e.printStackTrace(); } ``` #### 示例:使用 `BufferedReader` 和 `BufferedWriter` 提高字符流效率 ```java try (BufferedReader br = new BufferedReader(new FileReader("input.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) { String line; while ((line = br.readLine()) != null) { bw.write(line); bw.newLine(); // 添加换行符 } } catch (IOException e) { e.printStackTrace(); } ``` 这些操作展示了如何高效地进行文本文件的读取与写入[^4]。 ### 文件对象与文件信息获取 Java 提供了 `File` 类来表示文件或目录路径,并能够查询文件属性,例如是否存在、是否可读写、文件大小等。以下代码演示了如何创建新文件并获取其相关信息: ```java File file = new File("example.txt"); try { if (file.createNewFile()) { System.out.println("File created: " + file.getName()); } else { System.out.println("File already exists."); } System.out.println("Absolute path: " + file.getAbsolutePath()); System.out.println("Writable: " + file.canWrite()); System.out.println("Readable: " + file.canRead()); System.out.println("File size in bytes: " + file.length()); } catch (IOException e) { System.out.println("An error occurred."); e.printStackTrace(); } ``` 此示例展示了 `File` 类的基本用法及其在文件管理中的作用[^3]。 ### 标准输入输出流 Java 中的标准输入输出通常通过 `System.in` 和 `System.out` 来实现。`BufferedReader` 可以用于从控制台读取用户输入,而 `System.out.println()` 则用于将信息打印到控制台。以下是一个标准输入输出的示例: ```java BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); try { System.out.println("请输入一些文字:"); String input = reader.readLine(); System.out.println("您输入的是:" + input); } catch (IOException e) { e.printStackTrace(); } finally { try { if (reader != null) { reader.close(); } } catch (IOException e) { e.printStackTrace(); } } ``` 该段代码展示了如何从标准输入读取数据并输出到标准输出[^1]。 ### 用户空间与内核空间切换 在执行 I/O 操作时,应用程序会从用户空间切换到内核空间。例如,当调用 `file.write(str)` 时,程序需要进入内核空间完成实际的数据写入操作。这种切换对于理解 I/O 性能优化至关重要。 ```java str = "i am friday"; // 用户空间 x = x + 2; file.write(str); // 切换到内核空间 y = x + 4; // 切换回用户空间 ``` 这一过程揭示了 I/O 操作背后的操作系统层面行为[^5]。 ### 对象流(Object Stream) 对象流允许直接将对象序列化为字节流并保存到文件中,或者从文件中反序列化对象。这在持久化存储或网络传输中非常有用。虽然没有具体代码展示,但它是 Java I/O 体系中不可或缺的一部分。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值