数据流捕获异常

时间:2013-01-22 04:10:11

标签: java data-stream

我根据我在网上为Data Streams找到的一些例子编写了这个类,并且我在每次运行结束时都收到了EOFException。当我查看它时,它说意外地达到了流的结束。它似乎在控制台上工作(至少它会喷出正确的数字序列)。当我在运行后检查内容时,文本文件只是乱码。

public class DataStreamExample {

    public static void main(String args[]) {
        int choice = 0;
        int[] numbers = { 25, 4, 19, 70, 12, 28, 39, 30 };

        System.out.println("This program will provide an example on how the Data Stream works.");
        System.out.println("Note: Data Streams only work with primative data types.");
        System.out.println();
        System.out.println();


        try {
            System.out.println("1. For write Data operation");
            System.out.println("2. For read Data operation");  
            System.out.println("Enter the number for the operation of your choice: ");

            BufferedReader buffRead = new BufferedReader(new InputStreamReader(System.in));
            choice = Integer.parseInt(buffRead.readLine());
            switch(choice){
                case 1:  
                    FileOutputStream fileOut = new FileOutputStream("Example.txt");
                    BufferedOutputStream buffOut = new BufferedOutputStream(fileOut);
                    DataOutputStream dOutput =new DataOutputStream (buffOut);
                    for (int i = 0; i < numbers.length; i ++) {
                        dOutput.writeInt(numbers[i]);
                    }
                    System.out.print("writing data ");  
                    dOutput.close();

                case 2:
                    FileInputStream fileIn = new FileInputStream("Example.txt");
                    BufferedInputStream buffIn = new BufferedInputStream(fileIn);
                    DataInputStream dInput = new DataInputStream (buffIn);
                    while (true){
                        System.out.print(dInput.readInt());
                    }

                default:
                    System.out.println("Invalid choice");  
            }
        } 
        catch (Exception e) {
            System.err.println("Error in read/write data to a file: " + e);
        }

    }
}

有没有人有任何建议或意见可以帮助清理这个,所以我不会在文件中得到胡言乱语,所以它没有捕获异常?我该如何结束操作并关闭流?

3 个答案:

答案 0 :(得分:1)

对于您的输入操作,您将永远阅读while(true),因此循环完成的唯一方法是抛出EOFException。如果你不希望操作以这种方式完成,你必须知道在开始之前你正在阅读多少个整数(并使用它来限制循环)。

文件看起来像乱码的原因是因为您将值写为二进制文件。如果你想读取文件中的int,你必须把它们写成文本。

另外,你应该在每个案例的末尾加上break;个陈述。

答案 1 :(得分:0)

有些事情:

  1. 当您输入 1 到“写入数据操作”时,您的案例陈述中没有break;,因此当您尝试写入数据时,整数被写入文件,然后第二个案例被执行,你尝试从中读取。不确定这是不是你的意图。但是您可以添加break来防止这种情况发生:

            case 1:  
                FileOutputStream fileOut = new FileOutputStream("Example.txt");
                BufferedOutputStream buffOut = new BufferedOutputStream(fileOut);
                DataOutputStream dOutput =new DataOutputStream (buffOut);
                for (int i = 0; i < numbers.length; i ++) {
                    dOutput.writeInt(numbers[i]);
                }
                System.out.print("writing data ");  
                dOutput.close();
                break;
    
  2. 当您尝试从数据文件中读取时,无限循环:

                while (true){
                    System.out.print(dInput.readInt());
                }
    

    这意味着它将继续尝试读取序列化的整数,直到文件结束。当达到文件末尾时,流会抛出EOFException。您可以尝试将循环更改为此以防止异常:

                while (dInput.available()>0){
                   System.out.print(dInput.readInt());
                }
                break;
    
  3. 当你打印整数时,它们会变得混乱。

  4. 文本文件是乱码,因为它不是文本。当您使用DataOutputStream时,您在流中写入的对象(或基元)将被处理,以便数据可移植。

答案 2 :(得分:0)

好吧,而不是使用

while (true){
    System.out.print(dInput.readInt());
 }

你应该使用

while(dInput.available()>0){
    System.out.print(dInput.readInt());
}

因为当你使用while(true)时,它总是从Stream读取,包括当流到达EOF(文件结束)
时 毕竟,您应该使用close()方法

关闭所有流