第五章: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类实现了文件的写入和读取操作,代码更加简洁。

相关推荐
Open-AI2 分钟前
Python如何判断一个数是几位数
python
IT技术分享社区3 分钟前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
极客代码6 分钟前
【Python TensorFlow】入门到精通
开发语言·人工智能·python·深度学习·tensorflow
义小深8 分钟前
TensorFlow|咖啡豆识别
人工智能·python·tensorflow
疯一样的码农12 分钟前
Python 正则表达式(RegEx)
开发语言·python·正则表达式
代码之光_198013 分钟前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
ajsbxi19 分钟前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
&岁月不待人&34 分钟前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
StayInLove37 分钟前
G1垃圾回收器日志详解
java·开发语言
对许41 分钟前
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“
java·log4j