使用Java中的DataInputStream读取整数

时间:2018-04-09 10:49:42

标签: java integer datainputstream

我有这个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()方法以及为什么我对某些数字有这个错误。谢谢!

2 个答案:

答案 0 :(得分:1)

DataInputStream用于从二进制流(字节)读取字节,文本文件包含整数值的文本表示。
所以它无法奏效。

您可以在DataInputStream.readInt() javadoc:

中找到相关信息
  

请参阅DataInput的readInt方法的常规协定。

DataInput().readInt()

的地方
  

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

     

返回的值是:

     <(>((a&amp; 0xff)&lt;&lt; 24)|((b&amp; 0xff)&lt;&lt; 16)|((c&amp; 0xff)&lt;&lt; 8)|(d&amp;   0xff的))

987读为57, 56, 55个字节。它错过了一个字节为int,因为int表示在4个字节上 而在EOFException调用期间抛出的readInt()为 此输入流在读取四个字节之前到达结尾 通过在文本文件中添加一个附加数字,您可以读取4个字节。所以&#34;工作&#34; :可以读取4个字节,但读取1234作为49,50,51,52个字节,根据825373492规范生成DataInput.readInt() int。

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

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

答案 1 :(得分:0)

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

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

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

或扫描仪,如davidxxx所示。