如何在Java程序中打开.dat文件

4

我手上有一个扩展名为.dat的文件,其中包含一些数据。我需要在Java程序中读取这些数据,并将其构建成我们定义的一些对象。我尝试了以下方法,但并没有成功。

FileInputStream fstream = new FileInputStream("news.dat");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));

有人能告诉我如何在Java中实现这个吗?

5个回答

8

这是什么类型的文件?它是包含序列化Java对象的二进制文件吗?如果是,那么你更需要使用ObjectInputStream而不是DataInputStream来读取它。

FileInputStream fis = new FileInputStream("news.dat");
ObjectInputStream ois = new ObjectInputStream(fis);
Object object = ois.readObject();
// ...

不要忘记在 finally 中使用 close() 来正确处理资源,但这超出了本问题的范围。

另请参阅:


1
如果没有提到finally { in.close() },那么在这个级别的问题中可能会被忽略,因此提到它是值得赞赏的。 - Andrzej Doyle

8
一个.dat文件通常是一个二进制文件,没有特定的关联格式。您可以以类似于您发布的方式读取文件的原始字节,但是您需要根据底层格式解释这些字节。特别是,当您说“打开”文件时,您希望在Java中发生什么事情?您想创建哪种对象?字节流应该如何映射到这些对象?
一旦您知道了这一点,您可以编写此层自己,或使用现有的API(假设它是标准格式)。
作为参考,您的示例不起作用,因为它假定二进制格式是平台默认字符集中的字符表示形式(根据InputStreamReader构造函数)。正如您所说的那样,这将无法将二进制转换为字符流(因为毕竟它不是)。
// BufferedInputStream not strictly needed, but much more efficient than reading
// one byte at a time
BufferedInputStream in = new BufferedInputStream (new FileInputStream("news.dat"));

这将为您提供一个缓冲流,它将返回文件的原始字节;您现在可以自己读取和处理它们,或将此输入流传递给某个库API,该API将为您创建适当的对象(如果存在这样的库)。


3
这完全取决于.dat文件的类型。不幸的是,.dat通常被用作数据文件的通用扩展名。如果它是二进制文件,您可以使用 FileInputStream fstream = new FileInputStream(new File("news.dat")); 并调用 read() 从文件中获取字节;如果是文本文件,则可以使用 BufferedReader buff = new BufferedInputReader(new FileInputStream(new File("news.dat"))); 并调用 readLine() 获取每行文本。[编辑]或者它可能是Java对象,这种情况下就像BalusC所说的那样。[/编辑]
在两种情况下,您都需要知道文件的格式来分割内容并从中获取含义,尽管如果它是文本文件,通过检查可以更容易地完成这个过程。

1

Please try the below code:

FileReader file = new FileReader(new File("File.dat"));
BufferedReader br = new BufferedReader(file);
String temp = br.readLine();
while (temp != null) {
   temp = br.readLine();
   System.out.println(temp);
}

0
更好的方法是使用try-with-resources,这样您就不必担心关闭资源。
以下是代码。
    FileInputStream fis = new FileInputStream("news.dat");
    try(ObjectInputStream objectstream = new ObjectInputStream(fis)){

          objectstream.readObject();
    }
    catch(IOException e){
         //
    }

我认为这更适合作为评论,因为它完善了现有的答案而不是添加新的解决方案。 - suvartheec
是的伙计..我也想这么做,但由于我还没有被允许发表评论,所以不得不这样做。干杯.. - skmangalam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接