0

我根据我在网上找到的一些关于数据流的示例编写了这个类,并且在每次运行结束时我都会收到一个 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);
        }

    }
}

有没有人有任何建议或观察可以帮助清理这个问题,所以我不会在文件中出现乱码,所以它不会捕获异常?我应该如何结束操作并关闭流?

4

3 回答 3

1

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

文件看起来像乱码的原因是因为您将值写入二进制。如果要读取文件中的整数,则必须将它们写为文本。

此外,您应该break;在每个案例的末尾添加语句。

于 2013-01-22T04:42:14.183 回答
0

一些事情:

  1. 当您输入1以“写入数据操作”时,您break;的 case 语句中没有,因此当您尝试写入数据时,整数被写入文件,然后执行第二种情况并尝试读取从中。不确定这是否是您的意图。但是您可以添加一个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写入流中的对象(或原语)时,将得到处理,以便数据可移植。

于 2013-01-22T04:40:12.220 回答
0

好吧,而不是使用

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

你应该使用

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

因为当你使用 while(true) 时,它总是从 Stream 中读取,包括当流到达 EOF (End Of File)
毕竟,你应该使用 close() 方法关闭所有流

于 2013-01-22T04:41:11.093 回答