Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数据流捕获异常_Java_Data Stream - Fatal编程技术网

Java 数据流捕获异常

Java 数据流捕获异常,java,data-stream,Java,Data Stream,我根据在网上找到的一些数据流示例编写了这个类,每次运行结束时都会得到一个EOFEException。当我查它时,它说出人意料地到达了小溪的尽头。它似乎在控制台上工作(至少它能说出正确的数字顺序)。不过,当我在运行后检查内容时,文本文件只是乱七八糟 public class DataStreamExample { public static void main(String args[]) { int choice = 0; int[] numbers =

我根据在网上找到的一些数据流示例编写了这个类,每次运行结束时都会得到一个EOFEException。当我查它时,它说出人意料地到达了小溪的尽头。它似乎在控制台上工作(至少它能说出正确的数字顺序)。不过,当我在运行后检查内容时,文本文件只是乱七八糟

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);
        }

    }
}
公共类数据流示例{
公共静态void main(字符串参数[]){
int-choice=0;
int[]数字={25,4,19,70,12,28,39,30};
System.out.println(“该程序将提供一个关于数据流如何工作的示例”);
System.out.println(“注意:数据流仅适用于primative数据类型。”);
System.out.println();
System.out.println();
试一试{
System.out.println(“1.用于写入数据操作”);
System.out.println(“2.用于读取数据操作”);
System.out.println(“输入所选操作的编号:”);
BufferedReader buffRead=新的BufferedReader(新的InputStreamReader(System.in));
choice=Integer.parseInt(buffRead.readLine());
开关(选择){
案例1:
FileOutputStream fileOut=新的FileOutputStream(“Example.txt”);
BufferedOutputStream buffOut=新的BufferedOutputStream(fileOut);
DataOutputStream dOutput=新的DataOutputStream(buffOut);
for(int i=0;i
是否有人有任何建议或意见,可以帮助清理这个文件,这样我就不会在文件中胡言乱语,这样它就不会捕获异常?我应该如何结束操作并关闭流?

一些事情:

  • 当您输入1以“写入数据操作”时,您没有
    中断中断
    ,以防止这种情况发生:

            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;
    
    这意味着它将继续尝试读取序列化整数,直到到达文件末尾。当到达文件末尾时,流抛出一个EOFEException`。您可以尝试将循环更改为此,以防止出现异常:

                while (dInput.available()>0){
                   System.out.print(dInput.readInt());
                }
                break;
    
  • 当你打印这些整数时,它们会乱成一团

  • 文本文件乱七八糟,因为它不是文本。使用
    DataOutputStream
    时,将处理写入流中的对象(或原语),以便数据可移植


  • 嗯,不是用

    while (true){
        System.out.print(dInput.readInt());
     }
    
    你应该使用

    while(dInput.available()>0){
        System.out.print(dInput.readInt());
    }
    
    因为当您使用while(true)时,它总是从流中读取,包括流到达EOF(文件末尾)时的数据

    毕竟,您应该使用close()方法关闭所有流。对于您的输入操作,您将永远读取
    ,而(true)
    ,因此完成循环的唯一方法是抛出
    EOFEException
    。如果不希望操作以这种方式完成,则必须在开始之前知道正在读取多少整数(并使用该整数限制循环)

    文件看起来像乱七八糟的原因是您正在将值写入二进制文件。如果要读取文件中的int,则必须将它们作为文本写入


    另外,你应该把
    break每个案例结尾处的语句。

    InputStream.available()是一种可怕的方法,永远不应该使用。@jtahlborn您能详细解释一下吗?它最多也不可靠。e、 g.我相信GZIPInputStream的
    available()
    方法返回1,直到流关闭,然后返回0。归根结底,使用该方法从来都不是一个好的理由。如果使用available()方法精确计算剩余的字节数,则是正确的。但该方法用于“估计”剩余字节数,而不是准确估计剩余字节数。所以我想我没有理由不使用这个方法不。available()不返回可用字节数或估计值。当仍有千兆字节需要读取时,它可以返回零。这与EOS的条件无关。请参阅Javadoc-1InputStream.available()是一个糟糕的方法,永远不应该使用。@Jon Lin感谢这真的很有帮助。最后,我在循环中放入了一个print语句,以指示写入文件的数字,效果非常好。(也就是说,除了您的建议之外)具体来说,available()>0作为EOS的测试是完全不正确的,正如它在Javadoc中所说的。您是建议在案例开始时进行计数,还是最好在分配数组时将其完全放在输入之前?
    while(dInput.available()>0){
        System.out.print(dInput.readInt());
    }