【问题标题】:Read an integer with DataInputStream in Java在 Java 中使用 DataInputStream 读取整数
【发布时间】:2018-04-09 10:49:42
【问题描述】:

我有这个 Java 代码:

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class DemoApp {

    public static void main(String args[]) {

        try (DataInputStream dis = new DataInputStream(new FileInputStream("abc.txt"))) {

            int k = dis.readInt();
            System.out.println(k);
        }

        catch (FileNotFoundException fnfe) {

            System.out.printf("ERROR: %s", fnfe); 
        }

        catch (IOException ioe) {

            System.out.printf("ERROR: %s", ioe);
        }
    }

}

当 abc.txt 文件包含数字 987 我有这个错误:java.io.EOFException 如果我运行程序时 abc.txt 包含数字 1234 我有这个结果:825373492。我只是想了解如何正是在 DataInputStream 中使用这个 readInt() 方法,以及为什么我对某些数字有这个错误。谢谢!

【问题讨论】:

    标签: java integer datainputstream


    【解决方案1】:

    DataInputStream 旨在从二进制流(字节)中读取字节,并且您的文本文件包含整数值的文本表示。
    所以它不能工作。

    您可以在DataInputStream.readInt() javadoc 中找到相关信息:

    参见 DataInput 的 readInt 方法的一般约定。

    DataInput().readInt() 声明的位置

    DataInput 接口用于从二进制文件中读取字节 在任何 Java 原语中流式传输并从中重建数据 类型。 ...

    返回值为:

    (((a & 0xff)

    987 被读取为57, 56, 55 字节。它错过了一个字节成为int,因为int 用4 个字节表示。
    而在 readInt() 调用期间抛出的 EOFException 为 此输入流在读取四个字节之前到达末尾。
    通过在文本文件中添加一个额外的数字,您可以读取 4 个字节。所以它“有效”:可以读取 4 个字节,但 1234 被读取为 49、50、51、52 ​​个字节,根据 DataInput.readInt() 规范产生 825373492 int。

    要从文本文件中读取 int 值,您可以使用 Scanner,例如:

    try (Scanner sc = new Scanner(new File("abc.txt"))) {
            int i = sc.nextInt();
            System.out.println(i);
    }
    

    【讨论】:

    • 感谢您的回复。我知道还有其他方法可以从文本文件中读取,但我想了解这个 DataInputStream 因为我知道它是一种原始数据类型的序列化方式,并且我正在尝试使用序列化
    • 不客气。我理解您的意思,但DataxxxStream 是数据流或更简单的字节流,而您的文件以文本形式表示数字。因此,设计用于读取文本的流(例如 Scanner 或 BufferedReader)匹配得更好。
    【解决方案2】:

    abc.txt 包含字符 1234,其 ASCII 表示为十六进制数字 0x31、0x32、0x33 和 0x34。如果你把这些写出来,你会注意到十六进制数 0x31323334 的十进制值是 825373492。

    解决方法是一次读取一个字节(不是一次整数),然后从字节中减去 0x30 以找到它所代表的数字。对于每个数字,您必须将前一个结果左移十倍(将十移动到数百,依此类推),然后为您从文件中读取的每个字节添加当前数字。

    或者,将字符读取为字符串,并将其传递给 Integer.parseInt 方法,该方法将为您进行繁琐的字符到数字的转换。要将字符读取为字符串,您可能需要使用 BufferedReader d = new BufferedReader(new InputStreamReader(in)).

    或者像 davidxxx 建议的那样是扫描仪。

    【讨论】:

      猜你喜欢
      • 2013-06-23
      • 2019-02-19
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多