第五章:Java高级特性 第三节 文件I/O操作

1. Java I/O流的基本概念

  • 什么是I/O流?

    I/O流是指输入输出流,用来处理数据的读取和写入。在Java中,I/O流分为字节流字符流,分别处理字节和字符的数据传输。

    • 字节流 :用于处理二进制数据,如图片、视频等,常用类是InputStreamOutputStream

    • 字符流 :用于处理文本数据,如ReaderWriter类。

    • 示例代码

      复制代码
      InputStream inputStream = new FileInputStream("input.txt");
      OutputStream outputStream = new FileOutputStream("output.txt");

    在这个例子中,我们分别创建了输入流和输出流来处理文件的读取和写入操作。


2. 文件的读取与写入操作(FileInputStream与FileOutputStream)

  • 文件读取

    使用FileInputStream可以从文件中读取数据,它是字节流的一种,用于处理二进制文件。

    • 示例代码

      复制代码
      try (FileInputStream fis = new FileInputStream("input.txt")) {
          int data;
          while ((data = fis.read()) != -1) {
              System.out.print((char) data);
          }
      } catch (IOException e) {
          e.printStackTrace();
      }

    在这里,我们通过FileInputStream读取文件内容,并逐字节打印到控制台。

  • 文件写入

    使用FileOutputStream可以将数据写入文件中,它是字节流的输出操作。

    • 示例代码

      复制代码
      try (FileOutputStream fos = new FileOutputStream("output.txt")) {
          String content = "Hello, Java I/O!";
          fos.write(content.getBytes());
      } catch (IOException e) {
          e.printStackTrace();
      }

    在这个例子中,我们将字符串写入到output.txt文件中,利用了getBytes()方法将字符串转换为字节数组。


3. 缓冲流与数据流的使用

  • 缓冲流

    缓冲流通过内部缓冲机制提高了I/O的效率。BufferedInputStreamBufferedOutputStream用于字节流,BufferedReaderBufferedWriter用于字符流。

    • 示例代码

      复制代码
      java
      ​
      ​
      复制代码
      try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"))) {
          String line;
          while ((line = reader.readLine()) != null) {
              System.out.println(line);
          }
      } catch (IOException e) {
          e.printStackTrace();
      }

    在这里,我们使用BufferedReader来逐行读取文本文件,效率更高。

  • 数据流

    DataInputStreamDataOutputStream可以用于读写基本数据类型,如intfloat等。

    • 示例代码

      复制代码
      java
      ​
      ​
      复制代码
      try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt"))) {
          dos.writeInt(42);
          dos.writeDouble(3.14);
      } catch (IOException e) {
          e.printStackTrace();
      }

    在这个例子中,我们通过DataOutputStream写入了一个整数和一个双精度数到文件中。


4. 对象序列化与反序列化

  • 序列化与反序列化的概念

    序列化是指将对象的状态转换为字节流的过程,而反序列化是指从字节流中恢复对象。Java提供了ObjectOutputStreamObjectInputStream用于对象的序列化和反序列化。

    • 示例代码

      复制代码
      try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.dat"))) {
          Person person = new Person("John", 30);
          oos.writeObject(person);
      } catch (IOException e) {
          e.printStackTrace();
      }

    这里,我们将一个Person对象序列化并保存到object.dat文件中。

  • 反序列化

    复制代码
    try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.dat"))) {
        Person person = (Person) ois.readObject();
        System.out.println(person);
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }

    在这个例子中,我们从文件中读取了序列化的对象并将其还原为Person对象。


5. NIO中的文件操作

  • 什么是NIO?

    Java NIO(New I/O)是Java提供的一种新的I/O方式,支持非阻塞I/O操作。通过java.nio包中的类,Java开发者可以更高效地处理大规模文件操作。

    • 文件操作示例

      复制代码
      Path path = Paths.get("example.txt");
      // 写入文件
      Files.write(path, "Hello, NIO!".getBytes());
      // 读取文件
      List<String> lines = Files.readAllLines(path);
      lines.forEach(System.out::println);

    在这里,我们通过NIO中的Files类实现了文件的写入和读取操作,代码更加简洁。

相关推荐
badhope4 小时前
Mobile-Skills:移动端技能可视化的创新实践
开发语言·人工智能·git·智能手机·github
码云数智-园园5 小时前
微服务架构下的分布式事务:在一致性与可用性之间寻找平衡
开发语言
吴佳浩5 小时前
GPU 编号进阶:CUDA\_VISIBLE\_DEVICES、多进程与容器化陷阱
人工智能·pytorch·python
C++ 老炮儿的技术栈5 小时前
volatile使用场景
linux·服务器·c语言·开发语言·c++
hz_zhangrl5 小时前
CCF-GESP 等级考试 2026年3月认证C++一级真题解析
开发语言·c++·gesp·gesp2026年3月·gespc++一级
大阿明5 小时前
Spring Boot(快速上手)
java·spring boot·后端
Liu628885 小时前
C++中的工厂模式高级应用
开发语言·c++·算法
bearpping5 小时前
Java进阶,时间与日期,包装类,正则表达式
java
IT猿手5 小时前
基于控制障碍函数的多无人机编队动态避障控制方法研究,MATLAB代码
开发语言·matlab·无人机·openclaw·多无人机动态避障路径规划·无人机编队
全栈凯哥5 小时前
18.Python中的导入类完全指南
python