在Test2.java中加入红色代码
第一部分是防止重复插入数据,第二部分是插入结束标志
File file = new File("QQ1.txt");
if(file.exists()){
file.delete();
}

fos = new FileOutputStream(file, true);
...................
...............
oos.writeObject(qq2);
oos.writeObject(null);
oos.flush();

解决方案 »

  1.   

    java.io.StreamCorruptedException
    是因为没有插入结束标志造成的
      

  2.   

    oos.writeObject(qq); 
    oos.writeObject(qq1); 
    oos.writeObject(qq2); 
    oos.flush(); 把oos.flush();改成oos.reset();看看能不能解决问题。
    估计你再次把对象写入文件的时候,用的是同一个对象(只是把对象里的成员信息修改)。这样的话程序是不会把对象修改后的版本写入文件的。
      

  3.   

    3楼的方法,试了一下
    执行一次 test2.java 后,再执行 test.java 出现 java.io.EOFException
    执行多次 test2.java 后,再执行 test.java 出现 java.io.StreamCorruptedException4楼的方法试都不用试,肯定错
    因为打印的只是奇数行数据
      

  4.   

    ObjectOutputStream是不能append的(magic number问题),必须把以前的取出来重新再放一遍,不然读的时候会抛java.io.StreamCorruptedException ObjectInputStream的readObject()方法也不会返回null,除非你写入null,他只会抛java.io.EOFException 异常
      

  5.   

    声明一下,上面的文件1和文件2中的文件应该是同一个,不是原来的一个是QQ1.txt,一个是QQ.txt;
      

  6.   

    首先谢谢你!
    你这样写,加上
    if(file.exists()){ 
    file.delete(); 

    下一次写得时候就会把上一次写入的内容删掉,这样的话就不能追加了。去掉
    if(file.exists()){ 
    file.delete(); 

    每次读的时候只能读到第一次写得。
    有没有更好的方法。
      

  7.   

    把读、写操作抽象为了两个方法
    调用代码在 main 方法中
    package com.qq.server;import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.util.ArrayList;
    import java.util.List;public class Test { /**
     * @param args
     */
    public static void main(String[] args) {
    Test test = new Test();
    QQ qq = new QQ(1, "231", "fds", "fds", "sadf", 3213, "fdsaf", "fdsafsd");
    System.out.println("新增的QQ :" + qq + "\n"); test.saveDataToFile("qq.txt", qq); System.out.println("保存后的数据:");
    List<QQ> list = test.getDataFromFile("qq.txt");
    for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
    }
    } /**
     * 写数据
     * 
     * @param filePath
     * @param newQQ
     */
    public void saveDataToFile(String filePath, QQ newQQ) {
    List<QQ> qqs = getDataFromFile(filePath);
    FileOutputStream fos = null;
    ObjectOutputStream oos = null; qqs.add(newQQ);
    try {
    File file = new File(filePath);
    if (file.exists()) {
    file.delete();
    }
    fos = new FileOutputStream(file, false);
    oos = new ObjectOutputStream(fos);
    for (int i = 0; i < qqs.size(); i++) {
    oos.writeObject(qqs.get(i));
    }
    oos.writeObject(null);
    oos.flush();
    oos.reset();
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    if (oos != null) {
    try {
    oos.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if (fos != null) {
    try {
    fos.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    } /**
     * 读数据
     * 
     * @param filePath
     * @return
     */
    public List<QQ> getDataFromFile(String filePath) {
    List<QQ> qqs = new ArrayList<QQ>();
    FileInputStream fis = null;
    ObjectInputStream ois = null; try {
    File file = new File(filePath);
    if (!file.exists()) {
    file.createNewFile();

    // 第一次执行时,因为没有数据,所以强行加入一个结束符号
    FileOutputStream fos = new FileOutputStream(file, true);
    fos = new FileOutputStream(file, true);
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(null);
    oos.flush();
    oos.close();
    }
    fis = new FileInputStream(file);
    ois = new ObjectInputStream(fis);
    QQ qq = null;
    while ((qq = (QQ) ois.readObject()) != null) {
    qqs.add(qq);
    }
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    } finally {
    if (ois != null) {
    try {
    ois.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    if (fis != null) {
    try {
    fis.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    return qqs;
    }
    }
      

  8.   

    不是把原来文件删了,而是把你们的数据先读出来,然后再和新数据一起写回去,
    具体可以参见楼上,要不要写入null看你读对象的方法怎么写了,不写的话度的时候就会抛java.io.EOFException异常,捕捉一下就可以了