我目前正在练习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);
}
}
我尝试了不同的方法,比如将我先读取的值包含在变量中。我知道我做错了什么,仍然在网上找到解决方案。但是我希望你们能帮助我,所以我还能学到更多。
答案 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