正在抛出java.io.EOFException
这段代码抛出了一个java.io.EOFException,我不知道为什么会发生这种情况正在抛出java.io.EOFException,java,eofexception,Java,Eofexception,这段代码抛出了一个java.io.EOFException,我不知道为什么会发生这种情况 import java.io.*; class ReadInts { public static void main(String[] args) { String fileName = "intData.dat"; int sum = 0; try { DataInputStream instr = new DataIn
import java.io.*;
class ReadInts {
public static void main(String[] args) {
String fileName = "intData.dat";
int sum = 0;
try {
DataInputStream instr = new DataInputStream(new BufferedInputStream(new FileInputStream(fileName)));
while (true) {
sum += instr.readInt();
System.out.println("The sum is: " + sum);
sum += instr.readInt();
System.out.println("The sum is: " + sum);
sum += instr.readInt();
System.out.println("The sum is: " + sum);
sum += instr.readInt();
System.out.println("The sum is: " + sum);
instr.close();
}
} catch (EOFException e) {
System.out.println("EOF reached for: " + fileName);
System.out.println(e.getMessage());
e.printStackTrace();
} catch (FileNotFoundException e) {
System.out.println("File " + fileName + " not found.");
e.printStackTrace();
} catch (IOException e) {
System.out.println("Problem reading " + fileName);
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
输入文件的内容为:
0
1
255
-1
在-1之后没有换行符的返回字符
我收到的输出是:
The sum is: 805974282
The sum is: 1648322068
EOF reaced for: intData.dat
null
java.io.EOFException
at java.io.DataInputStream.readInt(DataInputStream.java:392)
at ReadInts.main(ReadInts.java:18)
输出完全出乎意料,我假设抛出异常,因为无论出于何种原因,sum的值大于int的最大值
我尝试将“int sum=0”更改为“long sum=0”,得到了相同的结果
我评论如下:
sumOfInts += instr.readInt();
System.out.println("The sum is: " + sumOfInts);
sumOfInts += instr.readInt();
// System.out.println("The sum is: " + sumOfInts);
// sumOfInts += instr.readInt();
// System.out.println("The sum is: " + sumOfInts);
// sumOfInts += instr.readInt();
执行此操作后,我收到以下异常:
The sum is: 805974282
The sum is: 1648322068
Problem reading intData.dat
Stream closed
java.io.IOException: Stream closed
at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:170)
at java.io.BufferedInputStream.read(BufferedInputStream.java:269)
at java.io.DataInputStream.readInt(DataInputStream.java:387)
at ReadInts.main(ReadInts.java:14)
如果有用的话,我使用的是Ubuntu18.04LTS
java版本“1.8.0_181”
Java(TM)SE运行时环境(build 1.8.0_181-b13)
Java HotSpot(TM)64位服务器虚拟机(构建25.181-b13,混合模式)
谢谢你的帮助
TonyDataInputStream将输入读取为4块中的字节。 所以,
0
1
255
-1
0\n,1\n是一个readInt
2,5,5\n是其他读物
-1是第三个readInt
所以,在三次readInt之后,当文件完成时,您将得到EOF异常。
此外,您还应该纠正wile循环。DataInputStream将输入读取为4块中的字节。 所以,
0
1
255
-1
0\n,1\n是一个readInt
2,5,5\n是其他读物
-1是第三个readInt
所以,在三次readInt之后,当文件完成时,您将得到EOF异常。
此外,您还应该纠正wile循环。问题在于readInt没有读取字符串并将字符串转换为数字;信息技术 读取四个输入字节并返回一个使用二进制算法计算的int值
0, \n(13), 1, \n(13) is 1st readInt
2, 5, 5, \n(13) is 2nd readInt
2 is third readInt after which you will get EOF exception
另一个建议是在finally块中关闭像stream这样的对象
public static void main(String[] args) throws Exception {
String fileName = "C:\\rsc\\intdat.dat";
int sum = 0;
DataInputStream instr=null;
try {
instr = new DataInputStream(new BufferedInputStream(new FileInputStream(fileName)));
while (instr.available()!=0) {
sum += Integer.parseInt(instr.readLine());
System.out.println("The sum is: " + sum);
}
} catch (EOFException e) {
System.out.println("EOF reached for: " + fileName);
System.out.println(e.getMessage());
e.printStackTrace();
} catch (FileNotFoundException e) {
System.out.println("File " + fileName + " not found.");
e.printStackTrace();
} catch (IOException e) {
System.out.println("Problem reading " + fileName);
System.out.println(e.getMessage());
e.printStackTrace();
}
finally{
if(instr!=null)
instr.close();
}
}
PS:InputStream是一个二进制结构。如果要读取文本数据,请改用BufferedReader问题在于readInt没有读取字符串并将字符串转换为数字;信息技术 读取四个输入字节并返回一个使用二进制算法计算的int值
0, \n(13), 1, \n(13) is 1st readInt
2, 5, 5, \n(13) is 2nd readInt
2 is third readInt after which you will get EOF exception
另一个建议是在finally块中关闭像stream这样的对象
public static void main(String[] args) throws Exception {
String fileName = "C:\\rsc\\intdat.dat";
int sum = 0;
DataInputStream instr=null;
try {
instr = new DataInputStream(new BufferedInputStream(new FileInputStream(fileName)));
while (instr.available()!=0) {
sum += Integer.parseInt(instr.readLine());
System.out.println("The sum is: " + sum);
}
} catch (EOFException e) {
System.out.println("EOF reached for: " + fileName);
System.out.println(e.getMessage());
e.printStackTrace();
} catch (FileNotFoundException e) {
System.out.println("File " + fileName + " not found.");
e.printStackTrace();
} catch (IOException e) {
System.out.println("Problem reading " + fileName);
System.out.println(e.getMessage());
e.printStackTrace();
}
finally{
if(instr!=null)
instr.close();
}
}
PS:InputStream是一个二进制结构。如果您想读取文本数据,请改用BufferedReader您的读取处于无限循环中,除非我遗漏了什么。所以你要在用完文件中的行之后再阅读。在注释掉代码的示例中,您尝试在关闭文件后读取。我猜这可能来自DataInputStream,它的读取量可能比您想象的要多。您应该在if stream为null检查的
finally
块中关闭流。您的读取处于无限循环中,除非我遗漏了什么。所以你要在用完文件中的行之后再阅读。在注释掉代码的示例中,您尝试在关闭文件后读取。我猜这可能来自DataInputStream,它的读取量可能比您想象的要多。您应该在finally
块中的if stream为空检查下关闭流。谢谢。这对我有用。我正在使用的课程中的代码不起作用。我甚至复制并粘贴了它,以确保我没有打字错误,它仍然不起作用。谢谢。这对我有用。我正在使用的课程中的代码不起作用。我甚至复制和粘贴它,以确保我没有打字错误,它仍然无法工作。