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