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

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

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 类
import java.io.File;
import java.io.IOException;

public class FileExample {
    public static void main(String[] args) {
        File file = new File("example.txt");

        // 创建文件
        try {
            if (file.createNewFile()) {
                System.out.println("File created: " + file.getName());
            } else {
                System.out.println("File already exists.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 检查文件是否存在
        if (file.exists()) {
            System.out.println("File exists.");

            // 获取文件信息
            System.out.println("File name: " + file.getName());
            System.out.println("Absolute path: " + file.getAbsolutePath());
            System.out.println("Writeable: " + file.canWrite());
            System.out.println("Readable: " + file.canRead());
            System.out.println("File size in bytes: " + file.length());
        }
    }
}
2. 使用字节流进行文件复制
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopyExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("source.txt");
             FileOutputStream fos = new FileOutputStream("destination.txt")) {
            int byteContent;
            while ((byteContent = fis.read()) != -1) {
                fos.write(byteContent);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
3. 使用字符流读写文件
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileReadWriteExample {
    public static void main(String[] args) {
        // 写入文件
        try (FileWriter writer = new FileWriter("example.txt")) {
            writer.write("Hello, World!\n");
            writer.write("Java I/O example.");
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 读取文件
        try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
4. 使用 NIO 进行文件复制
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class NIOFileCopyExample {
    public static void main(String[] args) {
        Path sourcePath = Paths.get("source.txt");
        Path destinationPath = Paths.get("destination.txt");

        try {
            Files.copy(sourcePath, destinationPath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


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

目录
相关文章
|
2天前
|
Java UED
Java中的异常处理实践
【6月更文挑战第18天】在Java的世界中,异常处理是代码健壮性的基石。本文将通过一个独特的视角——将异常处理比作一场戏剧,来探讨如何优雅地处理这些意外事件。我们将跟随异常的脚步,从它们的起源到最终的归宿,了解如何捕捉、解析和处理它们,确保程序即使在面对意外时也能稳定运行。
|
7天前
|
Java 视频直播 数据库连接
Java I/O 模型详解:BIO、NIO 与 AIO 的特性与应用
Java I/O 模型详解:BIO、NIO 与 AIO 的特性与应用
14 2
|
7天前
|
存储 前端开发 Java
深入解析Java类加载机制:原理、过程与实践
深入解析Java类加载机制:原理、过程与实践
14 2
|
8天前
|
Java 编译器
Java中的异常处理:从理论到实践
【6月更文挑战第12天】本文将深入探讨Java中的异常处理机制,包括异常的定义、类型、捕获和处理。我们将通过实例来展示如何在Java程序中有效地使用异常处理,以提高代码的健壮性和可读性。
21 1
|
13天前
|
Java 调度 数据库
Java中的多线程编程:基础与实践
【6月更文挑战第7天】本文将深入探讨Java中的多线程编程,包括其基本概念、创建方法以及在实际应用中的一些技巧。我们将通过实例来展示如何在Java中有效地使用多线程,以提高程序的性能和响应能力。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解。
|
4天前
|
Java 程序员 API
Java中的函数式编程:一种现代化的编码实践
在Java的世界中,面向对象编程(OOP)长期占据着主导地位。然而,随着软件工程的不断进步和编程语言的发展,函数式编程(FP)作为一种更加简洁、表达力更强的编程范式,逐渐在Java社区中获得了认可。本文将深入探讨Java如何拥抱函数式编程的概念,包括Lambda表达式、Stream API等特性的介绍,以及它们如何改变了我们编写和维护代码的方式。通过实际示例,我们将揭示函数式编程如何在提高代码可读性、简化并行处理等方面展现其优势,同时也指出了在学习和应用这一范式时可能遇到的挑战与解决策略。
|
5天前
|
缓存 安全 Java
Java中的并发编程:理论与实践
在软件开发中,特别是在多核处理器普及的今天,如何有效地处理并发问题成为了开发者们不可忽视的挑战。本文将深入探讨Java中的并发编程,包括基本概念、常见问题及其解决方案,以及如何利用Java提供的工具和技术实现高效、安全的并发程序。
|
8天前
|
分布式计算 自然语言处理 大数据
【大数据】MapReduce JAVA API编程实践及适用场景介绍
【大数据】MapReduce JAVA API编程实践及适用场景介绍
19 0
|
9天前
|
网络协议 Java API
全网最清晰JAVA NIO,看一遍就会
全网最清晰JAVA NIO,看一遍就会
22 0