在java

时间:2018-04-21 08:53:11

标签: java file-handling

我目前正在练习Java中的文件处理,所以我尝试创建一个方法,使用writeUTF()和其他写函数对文件上的用户输入进行编码。

我的代码如下所示:

public static void writeInfo(File file, int id, String name, int age) throws FileNotFoundException{
    DataOutputStream dataOut = new DataOutputStream(new
            BufferedOutputStream(new FileOutputStream(file, true)));
    try{
        dataOut.writeInt(id);
        dataOut.writeUTF(name);
        dataOut.writeInt(age);
        dataOut.close();
    }catch(FileNotFoundException ex){
        System.err.println("File not found !");
    }catch(IOException ex){
        System.err.println("Error writing in file !");
    }finally{
        try{
            dataOut.close();
        }catch(IOException ex){
            System.err.println(ex);
        }
    } 
}

现在我的问题是,在有多个输入后,我无法打印出一组特定的值。例如,如果我有3组输入:

ID - 3 名字 - 王牌 年龄 - 20岁

ID - 8 姓名 - 玛丽 年龄 - 22岁

ID - 5 姓名 - 卡尔 年龄 - 25岁

如果我想找到ID值为5的输入集,则输出应为:

ID - 5
Name - Karl
Age - 25

但是我在运行后总是得到一个EndOfFileException。

这是我找到特定值的代码:

 public static void readID(File file, int id) throws FileNotFoundException{
    DataInputStream dataIn = new DataInputStream(new
        BufferedInputStream(new FileInputStream(file)));
    try{
        while(dataIn.available()>0){
            if(dataIn.readInt() != id){
                dataIn.read();
                continue;
            }else{
                System.out.println("ID : " + dataIn.readInt());
                System.out.println("Name : " + dataIn.readUTF());
                System.out.println("Age : " + dataIn.readInt());
                System.out.println("\n");
            }
        }
    }catch(FileNotFoundException e){
        System.err.println("File not found !");
    }catch(IOException e){
        System.err.println(e);
    }finally{
        try{
            dataIn.close();
        }catch(IOException ex){
            System.err.println(ex);
        }
    }

我尝试了不同的方法,比如将我先读取的值包含在变量中。我知道我做错了什么,仍然在网上找到解决方案。但是我希望你们能帮助我,所以我还能学到更多。

1 个答案:

答案 0 :(得分:0)

问题在于:

    while(dataIn.available()>0){
        if(dataIn.readInt() != id){ // <--- #1
            dataIn.read(); // <--- #2
            continue;
        }else{
            System.out.println("ID : " + dataIn.readInt()); // <-- #3
            System.out.println("Name : " + dataIn.readUTF());
            System.out.println("Age : " + dataIn.readInt());
            System.out.println("\n");
        }
    }

如果int符合您的要求(if语句为int),则第1行将消耗流中的false,{{1已执行块,但第3行中的else将在最后一个readInt后继续读取,readInt字段。

更重要的是,如果name语句为真,则第2行会读取一个if并跳过它,这对于byte字段和{{ 1}} field。

因此以下代码可能有效:

name

或者更简洁:

age