java.io.Stream Corruptiod Exception:invalid type code:AC解決方法
3090 ワード
問題の説明:
一つのファイルにプログレッシブオブジェクトを書き込むときは、ファイルの末尾にプログレッシブオブジェクトを追加するだけで、FileOutputStream(ファイル名、true)を使用して間接的にObject OutputStreamストリームオブジェクトを構築し、外部にデータを読むときに初めてラインを運ぶときにエラーが発生しません。第二回でjava.io.StreamCorruptio:invalid type code:ACエラーを報告します。
理由:
一つのファイルには頭とファイルがあります。FileOutputStream(ファイル名、true)を複数回使って構築したObject OutputStreamオブジェクトに対して同じファイルにデータを書き込みますので、毎回データを書く時はこのファイルの末尾にheaderがあなたの書く対象データを書き込みます。読み取りの時にこのファイル体の中のheaderがあったらエラーが発生します。読み出し時にstream corput異常が発生します。
解决方法:だから、ここで初めてファイルを书くかどうかを判断します。
コードの例:
1.ObjectApendOutputStream.javaファイル
一つのファイルにプログレッシブオブジェクトを書き込むときは、ファイルの末尾にプログレッシブオブジェクトを追加するだけで、FileOutputStream(ファイル名、true)を使用して間接的にObject OutputStreamストリームオブジェクトを構築し、外部にデータを読むときに初めてラインを運ぶときにエラーが発生しません。第二回でjava.io.StreamCorruptio:invalid type code:ACエラーを報告します。
理由:
一つのファイルには頭とファイルがあります。FileOutputStream(ファイル名、true)を複数回使って構築したObject OutputStreamオブジェクトに対して同じファイルにデータを書き込みますので、毎回データを書く時はこのファイルの末尾にheaderがあなたの書く対象データを書き込みます。読み取りの時にこのファイル体の中のheaderがあったらエラーが発生します。読み出し時にstream corput異常が発生します。
解决方法:だから、ここで初めてファイルを书くかどうかを判断します。
コードの例:
1.ObjectApendOutputStream.javaファイル
class ObjectAppendOutputStream extends ObjectOutputStream {
public ObjectAppendOutputStream() throws IOException {
super();
}
public ObjectAppendOutputStream(OutputStream out) throws IOException {
super(out);
}
@Override
protected void writeStreamHeader() throws IOException {
return;
}
}
2、Object ToFileUtilpublic class ObjectToFileUtil {
public static void write(String path, T t) {
List ts = new ArrayList();
ts.add(t);
write(path, ts);
}
public static void write(String path, List ts) {
ObjectOutputStream out = null;
try { //
File file = new File(path);
if (file.exists() == false) {
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file, true);
if (file.length() < 1) {
out = new ObjectOutputStream(fos);
} else {
out = new ObjectAppendOutputStream(fos);
}
//
for (T t : ts) {
out.writeObject(t);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static T readOne(String path){
List temp = read(path);
if(temp ==null || temp.size() == 0 ){
return null;
}
return temp.get(0);
}
public static List read(String path){
List result = new ArrayList();
ObjectInputStream in = null;
try {
in = new ObjectInputStream(new BufferedInputStream(new FileInputStream(path)));
Object temp = null;
while ((temp = in.readObject()) != null) {
T t = (T)temp;
result.add(t);
}
} catch (EOFException e) {
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
public static void main(String[] args) {
List list = new ArrayList();
list.add(new User("admin", "admin", "123", 1));
list.add(new User("zhang", "zhang", "123", 0));
list.add(new User("san", "san", "123", 0));
String path = "d://abcd.data";
ObjectToFileUtil.write(path, list);
ObjectToFileUtil.write(path, new User("tian", "tian", "123", 0));
List users = ObjectToFileUtil.read(path);
for(User u:users){
System.out.println(u.name);
}
}
}