Java 中 FileInputStream 和 ObjectInputStream 的区别


在 Java 中处理文件时,可以使用不同的类来读取文件中的信息。两个常用的类是 FileInputStream 和 ObjectInputStream。虽然这两个类都用于从文件中读取信息,但它们在方法和功能上有所不同。在本文中,我们将探讨 FileInputStream 和 ObjectInputStream 之间的区别,并了解何时使用它们。

语法

在深入了解差异之前,让我们先了解 FileInputStream 和 ObjectInputStream 的语法:

FileInputStream 语法

FileInputStream fis = new FileInputStream("file.txt");

ObjectInputStream 语法

FileInputStream fis = new FileInputStream("file.txt");
ObjectInputStream ois = new ObjectInputStream(fis);

语法解释

FileInputStream 类能够从文件中读取原始字节。它接受文件名或文件描述符作为参数,并打开一个用于读取的流。另一方面,ObjectInputStream 是一个更高级别的类,它扩展了 FileInputStream。它提供了额外的功能,可以从文件中读取序列化对象。要使用 ObjectInputStream,我们首先需要创建一个 FileInputStream 实例,然后将其作为参数传递给 ObjectInputStream 构造函数。

方法 1:FileInputStream

FileInputStream 类在字节级别工作,主要用于从文件中读取原始数据。它提供了一个可以连续读取的字节流。让我们详细了解该方法:

算法

  • 通过提供文件名或文件描述符创建 FileInputStream 实例。

  • 创建一个缓冲区或字节数组来存储从文件中读取的数据。

  • 使用 FileInputStream 的 read() 方法将文件中的数据读取到缓冲区中。

  • 根据需要处理缓冲区中的数据。

示例

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamExample {
   public static void main(String[] args) {
      try {
         FileInputStream fis = new FileInputStream("file.txt");
         byte[] buffer = new byte[1024];
         int bytesRead = fis.read(buffer);
         while (bytesRead != -1) {
            // Process the data from the buffer
            System.out.println(new String(buffer, 0, bytesRead));
            bytesRead = fis.read(buffer);
         }
         fis.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

输出

This is an example text file.
It contains some sample data
to demonstrate the usage of FileInputStream.

在此代码示例中,我们使用文件名“file.txt”创建了一个 FileInputStream 实例。我们还创建了一个名为“buffer”的字节数组来存储从文件中读取的数据。在 while 循环中,我们使用 FileInputStream 的 read() 方法将文件中的数据读取到缓冲区中。然后,我们处理缓冲区中的数据,在本例中,只是将其打印到控制台。循环持续进行,直到 read() 方法返回 -1,表示文件结束。最后,我们关闭 FileInputStream 以释放系统资源。

方法 2:ObjectInputStream

ObjectInputStream 类用于从文件中读取序列化对象。它提供了更高级别的功能来处理对象序列化和反序列化。让我们探索该方法:

算法

  • 通过提供文件名或文件描述符创建 FileInputStream 实例。

  • 通过将 FileInputStream 实例作为参数创建 ObjectInputStream 实例。

  • 使用 ObjectInputStream 的 readObject() 方法从文件中读取序列化对象。

  • 根据需要处理对象。

示例

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class ObjectInputStreamExample {
   public static void main(String[] args) {
      try {
         FileInputStream fis = new FileInputStream("file.ser");
         ObjectInputStream ois = new ObjectInputStream(fis);
         Object obj = ois.readObject();
         // Process the object as required
         System.out.println(obj.toString());
         ois.close();
      } catch (IOException | ClassNotFoundException e) {
         e.printStackTrace();
      }
   }
}

输出

This is an example text file.
It contains some sample data
to demonstrate the use of FileInputStream.

在此代码示例中,我们使用文件名“file.txt”创建了一个 FileInputStream 实例。然后,我们通过将 FileInputStream 实例作为参数创建了一个 ObjectInputStream 实例。使用 ObjectInputStream 的 readObject() 方法,我们从文件中读取了序列化对象。然后,我们可以根据需要处理该对象。在本例中,我们只是使用 toString() 方法将对象打印到控制台。最后,我们关闭 ObjectInputStream 以释放系统资源。

Java 中 FileInputStream 和 ObjectInputStream 的区别

区别

FileInputStream

ObjectInputStream

用途

用于从文件中读取原始字节。

用于从文件中读取序列化对象。

流类型

在字节级别操作,提供一个字节流。

扩展 FileInputStream 的更高级别类。

数据处理

需要额外的处理才能将字节转换为所需的数据类型。

自动处理对象序列化和反序列化。

与非序列化数据的使用

适用于从文件中读取任何类型的数据。

不适合读取非序列化数据。

依赖项

直接依赖于 FileInputStream 类。

扩展 FileInputStream 类以获得额外的功能。

结论

总而言之,Java 中的 FileInputStream 和 ObjectInputStream 类提供了不同的方法来从文件中读取信息。FileInputStream 用于读取原始字节,而 ObjectInputStream 用于读取序列化对象。了解这些类之间的区别及其特定的用例对于在 Java 中有效地进行文件处理至关重要。通过根据您的需求使用合适的类,您可以成功地读取和处理 Java 应用程序中的文件数据。

更新于: 2023年7月28日

254 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告