深入了解 Java I/O:输入和输出操作

简介: 深入了解 Java I/O:输入和输出操作

文章目录

什么是 Java I/O?

输入(Input):

输出(Output):

核心类

InputStream 和 OutputStream

Reader 和 Writer

File

BufferedInputStream 和 BufferedOutputStream

BufferedReader 和 BufferedWriter

FileInputStream 和 FileOutputStream

FileReader 和 FileWriter

DataInputStream 和 DataOutputStream

常见用法

从键盘读取用户输入:

读取文件内容并在控制台上显示:

将数据写入文件

读取二进制文件内容并写入另一个文件

设计模式:

总结


什么是 Java I/O?

Java I/O 是 Java 编程语言用于进行输入和输出操作的机制和类集合。它允许我们与外部设备、文件系统、网络和其他数据源进行交互。Java I/O 分为输入和输出两个部分。


输入(Input):

从外部数据源(如键盘、文件、网络)读取数据到程序中。


输出(Output):

将程序中的数据写入外部目标(如文件、控制台、网络)。


核心类

Java I/O 提供了许多核心类,用于处理不同类型的输入和输出操作。以下是一些常用的核心类:


InputStream 和 OutputStream

这是字节流(Byte Stream)I/O 操作的基本类。InputStream 用于读取字节数据,OutputStream 用于写入字节数据。


Reader 和 Writer

这是字符流(Character Stream)I/O 操作的基本类。Reader 用于读取字符数据,Writer 用于写入字符数据。


File

用于操作文件和目录的类,可以创建、删除、重命名文件和目录,以及获取文件和目录的属性。


BufferedInputStream 和 BufferedOutputStream

这些类提供了缓冲区功能,可以提高字节流的读写效率。


BufferedReader 和 BufferedWriter

这些类提供了缓冲区功能,可以提高字符流的读写效率。


FileInputStream 和 FileOutputStream

这些类用于从文件读取字节数据和将字节数据写入文件。


FileReader 和 FileWriter

这些类用于从文件读取字符数据和将字符数据写入文件。


DataInputStream 和 DataOutputStream

这些类提供了读写基本数据类型(如整数、浮点数、布尔值)的方法。


以上只是一小部分 Java I/O 的核心类,Java 还提供了其他用于网络操作、对象序列化、压缩和解压缩等功能的类。


常见用法

下面是一些常见的 Java I/O 操作示例:

从键盘读取用户输入:

读取文件内容并将其显示在控制台上:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String input = reader.readLine();

读取文件内容并在控制台上显示:

BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
String line;
while ((line = reader.readLine()) != null) {
    System.out.println(line);
}
reader.close();

将数据写入文件

BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));
writer.write("Hello, world!");
writer.close();
读取二进制文件内容并写入另一个文件:

读取二进制文件内容并写入另一个文件

FileInputStream inputStream = new FileInputStream("input.bin");
FileOutputStream outputStream = new FileOutputStream("output.bin");
int byteData;
while ((byteData = inputStream.read()) != -1) {
    outputStream.write(byteData);
}
inputStream.close();
outputStream.close();

Java I/O 还提供了更多强大和灵活的功能,如处理对象的序列化和反序列化、网络通信和压缩文件等。


设计模式:

Java I/O 使用了装饰者模式来实现对输入和输出流的功能扩展和组合。装饰者模式是一种结构设计模式,它允许在不改变现有对象的情况下动态地将功能添加到对象中。


在 Java I/O 中,装饰者模式通过在现有的输入和输出流周围包装额外的功能来实现。这些包装器称为装饰者,它们与原始流实现相同的接口,并且可以透明地传递操作给底层流。这样,可以根据需要将多个装饰者层叠在一起,形成一个功能丰富的流处理管道。

以下是 Java I/O 中装饰者模式的主要角色:


组件(Component):这是装饰者模式的基本接口,它定义了被装饰者和装饰者的共同行为。在 Java I/O 中,InputStream、OutputStream、Reader 和 Writer 都是组件接口。


具体组件(Concrete Component):这是实现组件接口的具体类,它提供了基本的输入和输出功能。在 Java I/O 中,FileInputStream、FileOutputStream、FileReader 和 FileWriter 是具体组件的示例。


装饰者(Decorator):这是实现组件接口的抽象类,它持有一个组件对象并在其上添加额外的功能。在 Java I/O 中,FilterInputStream、FilterOutputStream、FilterReader 和 FilterWriter 是装饰者的示例。


具体装饰者(Concrete Decorator):这是实现装饰者抽象类的具体类,它通过扩展或修改组件的行为来提供特定的功能。在 Java I/O 中,BufferedInputStream、

BufferedOutputStream、BufferedReader 和 BufferedWriter 是具体装饰者的示例。


装饰者模式的工作流程如下:


创建一个具体组件对象,它实现了基本的输入和输出功能。

创建一个具体装饰者对象,它接收一个具体组件对象作为参数。

在具体装饰者中,通过调用父类的方法来传递操作给组件对象。

添加额外的功能或修改组件的行为。

可以进一步包装其他装饰者对象,形成多层嵌套的装饰器链。


Java I/O 中的装饰者模式示例:

InputStream inputStream = new FileInputStream("file.txt");
InputStream bufferedInputStream = new BufferedInputStream(inputStream);
InputStream gzipInputStream = new GZIPInputStream(bufferedInputStream);
int data = gzipInputStream.read();
while (data != -1) {
    // 处理数据
    System.out.print((char) data);
    data = gzipInputStream.read();
}
gzipInputStream.close();

装饰者模式的优点包括:


动态地扩展对象的功能,无需修改现有代码。

可以根据需要灵活地组合和配置多个装饰者。

遵循开闭原则,使得代码易于扩展和维护。


Java I/O 中的装饰者模式提供了一种灵活和可扩展的方式来增强输入和输出流的功能。通过组合和嵌套装饰者对象,可以构建功能丰富的流处理管道,以满足不同的输入和输出需求。


总结

Java I/O 是 Java 编程中不可或缺的一部分,它提供了许多类和方法用于处理输入和输出操作。本文介绍了 Java I/O 的基本概念、核心类和常见用法。通过深入了解 Java I/O,您可以更好地处理文件操作、网络通信和其他输入输出需求,提高程序的灵活性和功能性。


希望本文对您理解和使用 Java I/O 有所帮助。如果您有任何疑问或需要进一步了解,请随时在评论中提问。谢谢阅读!


目录
相关文章
|
13天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
4月前
|
Java BI 数据处理
如何在Java中实现Excel操作
如何在Java中实现Excel操作
|
5月前
|
存储 Java
java用modbus4j的RTU去操作那些寄存器(线圈,保持,输入,离散输入寄存器)
java用modbus4j的RTU去操作那些寄存器(线圈,保持,输入,离散输入寄存器)
125 0
|
4月前
|
存储 缓存 Oracle
可能是最漂亮的Java I/O流详解
大家有什么思路吗?评论区一起讨论讨论。我需要使用 Java 逐行读取大约 5-6 GB 的大型文本文件。我怎样才能快速完成此操作?最高赞的回答是叫Peter Lawrey的老哥回答的。大家好,我是南哥。一个Java学习与进阶的领路人,今天指南的是Java I/O流,跟着南哥我们一起在Java之路上成长。本文收录在我开源的《Java学习进阶指南》中,涵盖了想要学习Java、成为更好的Java选手都在偷偷看的核心知识、面试重点。
121 1
可能是最漂亮的Java I/O流详解
|
4月前
|
存储 Java 索引
Java ArrayList操作指南:如何移除并返回第一个元素
通过上述方法,你可以方便地从Java的 `ArrayList` 中移除并返回第一个元素。这种操作在日常编程中非常常见,是处理列表时的基本技能之一。希望这篇指南能帮助你更好地理解和运用Java的 `ArrayList`。
48 4
|
4月前
|
Java Linux
Java演进问题之1:1线程模型对于I/O密集型任务如何解决
Java演进问题之1:1线程模型对于I/O密集型任务如何解决
|
4月前
|
分布式计算 DataWorks Java
DataWorks操作报错合集之使用ODPS Tunnel Upload功能时,遇到报错:Java 堆内存不足,该如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
4月前
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作
|
4月前
|
Java API 开发者
Java中的文件I/O操作详解
Java中的文件I/O操作详解
|
4月前
|
Java BI 数据处理
如何在Java中实现Excel操作
如何在Java中实现Excel操作