Java I/O 详解:基础、文件操作与 NIO 实践

embedded/2024/9/25 8:22:39/

Java I/O 详解:基础、文件操作与 NIO 实践

Java I/O (输入输出) 是指用于读取和写入数据的 API,包括从文件、网络和其他数据源进行读取和写入操作。Java 提供了丰富的类和接口来实现各种 I/O 操作,主要包括标准 I/O、文件 I/O 和新 I/O (NIO)。以下是 Java I/O 的详细介绍:

一、基本 I/O

1. 字节流 (Byte Streams)

字节流用于处理原始二进制数据,通常用于处理图片、音频、视频等二进制文件。

  • 输入流 (InputStream)
    • FileInputStream: 从文件中读取字节流。
    • ByteArrayInputStream: 从字节数组中读取数据。
    • BufferedInputStream: 为其他输入流添加缓冲功能。
  • 输出流 (OutputStream):
    • FileOutputStream: 将字节流写入文件。
    • ByteArrayOutputStream: 将数据写入字节数组。
    • BufferedOutputStream: 为其他输出流添加缓冲功能。
2. 字符流 (Character Streams)

字符流用于处理文本数据,字符流以 16 位 Unicode 字符为单位处理数据。

  • 输入流 (Reader)

    • FileReader: 从文件中读取字符流。
    • StringReader: 从字符串中读取字符数据。
    • BufferedReader: 为其他字符输入流添加缓冲功能,并提供按行读取的功能。
  • 输出流 (Writer)

    • FileWriter: 将字符流写入文件。
    • StringWriter: 将字符数据写入字符串。
    • BufferedWriter: 为其他字符输出流添加缓冲功能。

二、文件 I/O

Java 提供了 File 类用于表示文件和目录,提供了多种方法来操作文件和目录。

  • File 类常用方法
    • createNewFile(): 创建一个新的文件。
    • mkdir(), mkdirs(): 创建一个或多个目录。
    • delete(): 删除文件或目录。
    • list(), listFiles(): 列出目录中的文件和子目录。

三、新 I/O (NIO)

NIO (New I/O) 引入了一些高效的 I/O 操作方式,包括缓冲区 (Buffers)、通道 (Channels) 和选择器 (Selectors)。

1. 缓冲区 (Buffers)

缓冲区是一个容器对象,用于特定基本数据类型的元素的线性、有限序列。NIO 缓冲区比传统 I/O 更加高效。

  • 常用缓冲区类型
    • ByteBuffer: 存储字节数据。
    • CharBuffer: 存储字符数据。
    • IntBuffer, LongBuffer, DoubleBuffer 等其他基本类型的缓冲区。
2. 通道 (Channels)

通道是用于 I/O 操作的对象,它能够读写数据,但不直接操作数据,而是通过缓冲区来进行操作。

  • 常用通道类型
    • FileChannel: 用于文件的读写操作。
    • SocketChannel: 用于 TCP 网络连接的读写操作。
    • DatagramChannel: 用于 UDP 网络连接的读写操作。
3. 选择器 (Selectors)

选择器允许一个线程管理多个通道的 I/O 操作。通过使用选择器,可以在一个单独的线程中管理多个通道,从而提高了效率。

  • 常用方法
    • select(): 阻塞直到至少有一个通道准备好了 I/O 操作。
    • selectNow(): 非阻塞地进行选择操作。
    • selectedKeys(): 返回准备好的通道的键集合。

四、文件操作示例

1. 使用 File 类
java">import javaion">.ioion">.Fileion">;
import javaion">.ioion">.IOExceptionion">;public class FileExample ion">{public static void ion">mainion">(Stringion">[ion">] argsion">) ion">{File file = new Fileion">("example.txt"ion">)ion">;// 创建文件try ion">{if ion">(fileion">.ion">createNewFileion">(ion">)ion">) ion">{Systemion">.oution">.ion">printlnion">("File created: " + fileion">.ion">getNameion">(ion">)ion">)ion">;ion">} else ion">{Systemion">.oution">.ion">printlnion">("File already exists."ion">)ion">;ion">}ion">} catch ion">(IOException eion">) ion">{eion">.ion">printStackTraceion">(ion">)ion">;ion">}// 检查文件是否存在if ion">(fileion">.ion">existsion">(ion">)ion">) ion">{Systemion">.oution">.ion">printlnion">("File exists."ion">)ion">;// 获取文件信息Systemion">.oution">.ion">printlnion">("File name: " + fileion">.ion">getNameion">(ion">)ion">)ion">;Systemion">.oution">.ion">printlnion">("Absolute path: " + fileion">.ion">getAbsolutePathion">(ion">)ion">)ion">;Systemion">.oution">.ion">printlnion">("Writeable: " + fileion">.ion">canWriteion">(ion">)ion">)ion">;Systemion">.oution">.ion">printlnion">("Readable: " + fileion">.ion">canReadion">(ion">)ion">)ion">;Systemion">.oution">.ion">printlnion">("File size in bytes: " + fileion">.ion">lengthion">(ion">)ion">)ion">;ion">}ion">}
ion">}
2. 使用字节流进行文件复制
java">import javaion">.ioion">.FileInputStreamion">;
import javaion">.ioion">.FileOutputStreamion">;
import javaion">.ioion">.IOExceptionion">;public class FileCopyExample ion">{public static void ion">mainion">(Stringion">[ion">] argsion">) ion">{try ion">(FileInputStream fis = new FileInputStreamion">("source.txt"ion">)ion">;FileOutputStream fos = new FileOutputStreamion">("destination.txt"ion">)ion">) ion">{int byteContention">;while ion">(ion">(byteContent = fision">.ion">readion">(ion">)ion">) != -1ion">) ion">{fosion">.ion">writeion">(byteContention">)ion">;ion">}ion">} catch ion">(IOException eion">) ion">{eion">.ion">printStackTraceion">(ion">)ion">;ion">}ion">}
ion">}
3. 使用字符流读写文件
java">import javaion">.ioion">.BufferedReaderion">;
import javaion">.ioion">.FileReaderion">;
import javaion">.ioion">.FileWriterion">;
import javaion">.ioion">.IOExceptionion">;public class FileReadWriteExample ion">{public static void ion">mainion">(Stringion">[ion">] argsion">) ion">{// 写入文件try ion">(FileWriter writer = new FileWriterion">("example.txt"ion">)ion">) ion">{writerion">.ion">writeion">("Hello, World!\n"ion">)ion">;writerion">.ion">writeion">("Java I/O example."ion">)ion">;ion">} catch ion">(IOException eion">) ion">{eion">.ion">printStackTraceion">(ion">)ion">;ion">}// 读取文件try ion">(BufferedReader reader = new BufferedReaderion">(new FileReaderion">("example.txt"ion">)ion">)ion">) ion">{String lineion">;while ion">(ion">(line = readerion">.ion">readLineion">(ion">)ion">) != nullion">) ion">{Systemion">.oution">.ion">printlnion">(lineion">)ion">;ion">}ion">} catch ion">(IOException eion">) ion">{eion">.ion">printStackTraceion">(ion">)ion">;ion">}ion">}
ion">}
4. 使用 NIO 进行文件复制
java">import javaion">.ioion">.IOExceptionion">;
import javaion">.io>nioion">.fileion">.Filesion">;
import javaion">.io>nioion">.fileion">.Pathion">;
import javaion">.io>nioion">.fileion">.Pathsion">;public class NIOFileCopyExample ion">{public static void ion">mainion">(Stringion">[ion">] argsion">) ion">{Path sourcePath = Pathsion">.ion">getion">("source.txt"ion">)ion">;Path destinationPath = Pathsion">.ion">getion">("destination.txt"ion">)ion">;try ion">{Filesion">.ion">copyion">(sourcePathion">, destinationPathion">)ion">;ion">} catch ion">(IOException eion">) ion">{eion">.ion">printStackTraceion">(ion">)ion">;ion">}ion">}
ion">}

这些示例展示了如何使用 Java I/O 和 NIO 进行文件操作。了解和掌握这些知识点有助于开发高效、可靠的 Java 应用程序。


http://www.ppmy.cn/embedded/46059.html

相关文章

案例|开发一个美业小程序,都有什么功能

随着移动互联网的迅猛发展,美业连锁机构纷纷寻求数字化转型,以小程序为载体,提升服务效率,增强客户体验。 线下店现在面临的困境: 客户到店排队时间过长,体验感受差 新客引流难,老用户回头客…

超越Devin!姚班带队,他们创大模型编程新世界纪录

超越Devin!SWEBench排行榜上迎来了新玩家—— StarShip CodeGen Agent,姚班带队初创公司OpenCSG出品,以23.67%的成绩获得全球第二名的成绩。 同时创造了非GPT-4o基模的最高纪录(SOTA)。 我们都知道,SWEBe…

在PostGIS中检查孤线(Find isolated lines in PostGIS)

场景 在PostGIS中有一张线要素表,需要检查该表中的孤线,并且进行自动纠正的计算。 其中孤线定义为两端端点都不在任何其他线的顶点上。 本文介绍在PostGIS中的线要素点,通过函数计算指定线要素表中的孤线,并计算最接近的纠偏位置。 In PostGIS, there is a table of line …

【MATLAB源码-第220期】基于matlab的Massive-MIMO误码率随着接收天线变化仿真采用ZF均衡和QPSK调制。

操作环境: MATLAB 2022a 1、算法描述 1. 系统背景与目标 无线通信系统的发展极大地推动了现代通信技术的进步,从移动通信到无线局域网,甚至是物联网,均依赖于无线通信系统的高效和可靠性。在无线通信系统中,核心目…

# Mybatis 高级用法和tk.mybatis使用

Mybatis 高级用法和tk.mybatis使用 文章目录 Mybatis 高级用法和tk.mybatis使用使用SelectProvider、InsertProvider、UpdateProvider、DeleteProviderSelectProvider使用例子 tk.mybatis引入依赖查询实现实体映射类实体类规范 dao层调用dao 使用SelectProvider、InsertProvide…

pytorch+YOLOv8-1

1.工具开发 2.idea配置pytorch环境 默认安装新版本torch pip install torch 3.pytorch验证 4. print(torch.cuda.is_available()) 输出结果为 False 说明我只能用cpu

vue3状态管理,pinia的使用

​​​​​​​状态管理 我们知道组件与组件之间可以传递信息,那么我们就可以将一个信息作为组件的独立状态(例如,单个组件的颜色)或者共有状态(例如,多个组件是否显示)在组件之传递&#xff0c…

做场外个股期权怎么询价

做场外个股期权怎么询价?没有具体的哪家做市商是询价是最低的,个人投资者需要通过机构通道方询价进行对比,各券商的报价由询价机构方提供给到投资者,可以参考不同券商的报价进行比对,再决定是否进行投资。本文来自&…