コース設計を行って、1日ここにとどまり、難しすぎて、数え切れないほどのBaidu、ブログなどの後、幸運にも、解決され、
メモを要約します。オブジェクトストリームを使用する場合は、ファイルに書き込みますまたは、読み取りに使用されるシリアル化されたオブジェクトであり、シリアル化されたオブジェクトがファイルに書き込まれると、システムは自動的にaced 0005のヘッダーを追加し、4バイトを占有します。これはインターネットで確認されています。本当です。
解決策:ファイルの書き込み時にファイルが既に存在するかどうか、またはオブジェクトが書き込まれたかどうかを確認するだけでよく、オブジェクトが書き込まれている場合は、前の4バイトを削除してファイルに書き込みます。
上記のコードをOKにします(記録はシリアル化されたクラスです。クラスを自分で確認することができます)
import java.io.*;
public class test {
public static void main(String args[]){
File file = new File("text.txt");
Recording r[] = new Recording[10];
boolean isexist=false;//定义一个用来判断文件是否需要截掉头aced 0005的
try{
if(file.exists()){ //文件是否存在
isexist=true;
FileOutputStream fo=new FileOutputStream(file,true);
ObjectOutputStream oos = new ObjectOutputStream(fo);
long pos=0;
if(isexist){
pos=fo.getChannel().position()-4;//追加的时候去掉头部aced 0005
fo.getChannel().truncate(pos);
}
oos.writeObject(new Recording("小明","锡纸烫",388,"李四","10.23"));//进行序列化
oos.close();
}
else{//文件不存在
file.createNewFile();
FileOutputStream fo=new FileOutputStream(file);
ObjectOutputStream wr1 = new ObjectOutputStream(fo);
wr1.writeObject(new Recording("小花","纹理烫",288,"张三","10.23"));
wr1.writeObject(new Recording("小明","锡纸烫",388,"李四","10.23"));
wr1.writeObject(new Recording("小刚","洗发",18,"张三","10.23"));
wr1.writeObject(new Recording("小强","洗发",18,"张三","10.23"));
wr1.writeObject(new Recording("小明","洗发",18,"张三","10.23"));
wr1.close(); // 写入操作完成
}
FileInputStream in = new FileInputStream(file);
ObjectInputStream re = new ObjectInputStream(in);
Recording test = null;
while((test = (Recording)re.readObject()) != null){
System.out.println(test.name);
}
re.close();
}
catch(IOException e){}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}