正在抛出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

这段代码抛出了一个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 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,混合模式)

谢谢你的帮助


Tony

DataInputStream将输入读取为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为空检查下关闭流。谢谢。这对我有用。我正在使用的课程中的代码不起作用。我甚至复制并粘贴了它,以确保我没有打字错误,它仍然不起作用。谢谢。这对我有用。我正在使用的课程中的代码不起作用。我甚至复制和粘贴它,以确保我没有打字错误,它仍然无法工作。