java.io.Stream Corruptiod Exception:invalid type code:AC解決方法


問題の説明:
一つのファイルにプログレッシブオブジェクトを書き込むときは、ファイルの末尾にプログレッシブオブジェクトを追加するだけで、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 ToFileUtil
public 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);
		}
	}
}