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 应用程序。

目录
相关文章
|
3月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
89 0
|
4月前
|
资源调度 安全 Java
Java 大数据在智能教育在线实验室设备管理与实验资源优化配置中的应用实践
本文探讨Java大数据技术在智能教育在线实验室设备管理与资源优化中的应用。通过统一接入异构设备、构建四层实时处理管道及安全防护双体系,显著提升设备利用率与实验效率。某“双一流”高校实践显示,设备利用率从41%升至89%,等待时间缩短78%。该方案降低管理成本,为教育数字化转型提供技术支持。
96 1
|
3月前
|
并行计算 Java API
Java List 集合结合 Java 17 新特性与现代开发实践的深度解析及实战指南 Java List 集合
本文深入解析Java 17中List集合的现代用法,结合函数式编程、Stream API、密封类、模式匹配等新特性,通过实操案例讲解数据处理、并行计算、响应式编程等场景下的高级应用,帮助开发者提升集合操作效率与代码质量。
136 1
|
3月前
|
安全 Java API
Java 17 及以上版本核心特性在现代开发实践中的深度应用与高效实践方法 Java 开发实践
本项目以“学生成绩管理系统”为例,深入实践Java 17+核心特性与现代开发技术。采用Spring Boot 3.1、WebFlux、R2DBC等构建响应式应用,结合Record类、模式匹配、Stream优化等新特性提升代码质量。涵盖容器化部署(Docker)、自动化测试、性能优化及安全加固,全面展示Java最新技术在实际项目中的应用,助力开发者掌握现代化Java开发方法。
128 1
|
3月前
|
SQL 缓存 安全
深度理解 Java 内存模型:从并发基石到实践应用
本文深入解析 Java 内存模型(JMM),涵盖其在并发编程中的核心作用与实践应用。内容包括 JMM 解决的可见性、原子性和有序性问题,线程与内存的交互机制,volatile、synchronized 和 happens-before 等关键机制的使用,以及在单例模式、线程通信等场景中的实战案例。同时,还介绍了常见并发 Bug 的排查与解决方案,帮助开发者写出高效、线程安全的 Java 程序。
161 0
|
3月前
|
存储 搜索推荐 算法
Java 大视界 -- Java 大数据在智慧文旅旅游线路规划与游客流量均衡调控中的应用实践(196)
本实践案例深入探讨了Java大数据技术在智慧文旅中的创新应用,聚焦旅游线路规划与游客流量调控难题。通过整合多源数据、构建用户画像、开发个性化推荐算法及流量预测模型,实现了旅游线路的精准推荐与流量的科学调控。在某旅游城市的落地实践中,游客满意度显著提升,景区流量分布更加均衡,充分展现了Java大数据技术在推动文旅产业智能化升级中的核心价值与广阔前景。
|
3月前
|
存储 Java 大数据
Java 大视界 —— 基于 Java 的大数据隐私保护在金融客户信息管理中的实践与挑战(178)
本文探讨了基于 Java 的大数据隐私保护技术在金融客户信息管理中的应用与挑战。随着金融行业数字化转型加速,客户信息的安全性愈发重要。文章详细分析了数据加密、脱敏、访问控制、区块链及联邦学习等关键技术,并结合实际案例展示了其在金融机构中的应用效果,为金融科技从业者提供了宝贵的实践经验与技术参考。
|
4月前
|
数据采集 机器学习/深度学习 Java
Java 大视界 —— Java 大数据在智慧交通停车场智能管理与车位预测中的应用实践(174)
本文围绕 Java 大数据在智慧交通停车场智能管理与车位预测中的应用展开,深入剖析行业痛点,系统阐述大数据技术的应用架构,结合大型体育中心停车场案例,展示系统实施过程与显著成效,提供极具实操价值的技术方案。
|
4月前
|
Java 数据库连接 API
Java 对象模型现代化实践 基于 Spring Boot 与 MyBatis Plus 的实现方案深度解析
本文介绍了基于Spring Boot与MyBatis-Plus的Java对象模型现代化实践方案。采用Spring Boot 3.1.2作为基础框架,结合MyBatis-Plus 3.5.3.1进行数据访问层实现,使用Lombok简化PO对象,MapStruct处理对象转换。文章详细讲解了数据库设计、PO对象实现、DAO层构建、业务逻辑封装以及DTO/VO转换等核心环节,提供了一个完整的现代化Java对象模型实现案例。通过分层设计和对象转换,实现了业务逻辑与数据访问的解耦,提高了代码的可维护性和扩展性。
165 1
|
4月前
|
安全 Java API
Java 抽象类与接口在 Java17 + 开发中的现代应用实践解析
《Java抽象类与接口核心技术解析》 摘要:本文全面剖析Java抽象类与接口的核心概念与技术差异。抽象类通过模板设计实现代码复用,支持具体方法与状态管理;接口则定义行为规范,实现多态支持。文章详细对比了两者在实例化、方法实现、继承机制等方面的区别,并提供了模板方法模式(抽象类)和策略模式(接口)的典型应用示例。特别指出Java8+新特性为接口带来的灵活性提升,包括默认方法和静态方法。最后给出最佳实践建议:优先使用接口定义行为规范,通过抽象类实现代码复用,合理组合两者构建灵活架构。
80 2

热门文章

最新文章