【问题标题】:Get EOFException while reading a txt file in Java在 Java 中读取 txt 文件时获取 EOFException
【发布时间】:2016-03-30 11:03:55
【问题描述】:

我有一段时间使用 Google,但我仍然感到困惑。当我使用 FileOutputStream 将一些文本写入 txt 文件,然后使用 FileInputStream 读取我的文件时,一切正常。但是当我在我的 txt 文件中手动输入一些单词,然后以 UTF-8 格式保存时,我得到了 EOFException。 这是我的输入代码:

StringBuilder s = new StringBuilder();
FileInputStream inputStream = new FileInputStream("filename");
DataInputStream in = new DataInputStream(inputStream);
while (in.available()>0) {
    s.append(in.readUTF());
}
in.close();
System.out.println(s); 

【问题讨论】:

  • AFAIK in.available() 返回可用字节数,而 in.readUTF() 可能读取跨越超过 1 个字节的字符。如果不是你应该检查你的文件编码,可能是你使用的编辑器搞砸了。
  • 顺便说一句,尝试使用new BufferedReader( new InputStreamReader(inputStream, "UTF-8")),这样可以更轻松地从文件中读取字符串(例如,有一个readLine() 方法)。

标签: java


【解决方案1】:
  • readUTF() 可以读取的文件必须由writeUTF() 写入。不是FileOutputStream
  • writeUTF() 写入的文件不是文本文件。它是一个由 16 位长度的单词和字符串组成的序列文件,采用修改后的编码,如 Javadoc 中所述。
  • available() > 0 不是文件结尾的有效测试。

正如您所说,它是一个文本文件,并且您的代码无法正常工作,我建议您应该使用BufferedReader.readLine()。并且没有ready() 测试。 readLine() 将在流结束时返回 null。

【讨论】:

    【解决方案2】:

    DataInputStream 的 Javadoc 说明如下:“应用程序使用数据输出流写入数据,这些数据稍后可以由数据输入流读取”。因此,使用 DataInputStream 从文件中读取手动编写的文本可能不是一个好主意。

    如果需要读取字节,请考虑使用FileInputStream#read() 方法,如果需要读取字符,请考虑使用FileReader#read()

    【讨论】:

      【解决方案3】:

      考虑使用 FileInputStream 读取文件,即:

      public static void main(String[] args) throws Exception {
          StringBuilder s = new StringBuilder();
          FileInputStream inputStream = new FileInputStream("file.txt");
          int content;
          while ((content = inputStream.read()) != -1) {
              s.append((char) content);
          }
          inputStream.close();
          System.out.println(s);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-17
        • 1970-01-01
        • 2012-11-02
        • 2011-02-05
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        • 2016-04-10
        相关资源
        最近更新 更多