public void writeObject(ShareFileInfo file) 
{
 ObjectOutputStream obWrite=null;
try {
     obWrite=new ObjectOutputStream(new FileOutputStream("SharedFile.db",true));
    obWrite .writeObject(file);
    obWrite.flush();
} catch (IOException e) {
// TODO: handle exception
JOptionPane.showMessageDialog(null,"文件写入错误","错误提醒",JOptionPane.ERROR_MESSAGE);
}
finally
{
try {
obWrite.close();
} catch (IOException e) {
// TODO: handle exception
JOptionPane.showMessageDialog(null,"文件关闭错误","错误提醒",JOptionPane.ERROR_MESSAGE);
}
}  
}
public LinkedList<ShareFileInfo> readObject()
{
ObjectInputStream obRead=null;
ShareFileInfo file=null;
LinkedList<ShareFileInfo>  shareFileInfos=new LinkedList<ShareFileInfo>();
try{
obRead=new ObjectInputStream(new FileInputStream("SharedFile.db"));
while(true)
{
file=(ShareFileInfo)obRead.readObject();
shareFileInfos.add(file);
}
}
catch(EOFException exception)
{
return shareFileInfos;
}
catch (IOException e) {
// TODO: handle exception
JOptionPane.showMessageDialog(null,"文件读入错误","错误提醒",JOptionPane.ERROR_MESSAGE);
}
catch(ClassNotFoundException e)
{
JOptionPane.showMessageDialog(null,"您尚未注册信息,请先注册账户","错误提醒",JOptionPane.ERROR_MESSAGE);
}
finally
{
try {
obRead.close();
} catch (IOException e) {
// TODO: handle exception
JOptionPane.showMessageDialog(null,"文件关闭错误","错误提醒",JOptionPane.ERROR_MESSAGE);
}
}
return shareFileInfos;
}
我用以上代码进行文件对象的读写,上面是文件读写的操作,在一个界面上点击一个写入按钮就写入一个对象,每次写入调用上面的那个writeObject方法,多次点击该按钮多次写入对象,当关闭该界面打开另一个界面点击读取按钮的时候就出现读取文件错误,输出来的只是第一个写入的对象,其余的对象读取不出来,不知道是怎么回事,希望高人指点,谢谢了

解决方案 »

  1.   

    对象流开始时都系有流的标识.你每次都是new出来,故多几个流标识.
    解决方法:
      写入流声明为全局变量.不过这样也是保证第一次无错.
      
    最好的方法:应该把object 转化成byte[].以 长度 + byte[]这样存储.估计你不会写.简单方法: 你应该先用一个集合(List)存放你的所有对象,写入文件时你就直接写入List.
               
               读取时就直接读取LIST.然后遍历LIST就可以得到你全部的写入对象.
      

  2.   

    给LZ一段sample吧,每次把需要保存的对象写在文件的最后
    import java.io.*;
    import java.util.*;public void writeObject(ShareFileInfo file) {
        ObjectOutputStream obWrite = null;
        RandomAccessFile raf = null;
        try {
            //obWrite=new ObjectOutputStream(new FileOutputStream("SharedFile.db",true));
            RandomAccessFile raf = new RandomAccessFile("SharedFile.db", "rw");
            raf.seek(raf.length());
            ByteArrayOutputStream bos = new ByteArrayOutbutStream();
            obWrite = new ObjectOutputStream(bos);
            obWrite.writeObject(file);
            obWrite.flush();
            byte[] b = bos.toByteArray();
            raf.writeInt(b.length);
            raf.write(b);        
        } catch (IOException e) {
            // TODO: handle exception
            JOptionPane.showMessageDialog(null,"文件写入错误","错误提醒",JOptionPane.ERROR_MESSAGE);
        } finally {
            try {
                if (raf != null) {
                    raf.close();
                }
            } catch (IOException e) {
                // TODO: handle exception
                JOptionPane.showMessageDialog(null,"文件关闭错误","错误提醒",JOptionPane.ERROR_MESSAGE);
            }
        }   
    }
    public LinkedList<ShareFileInfo> readObject() {
        ObjectInputStream obRead=null;
        ShareFileInfo file=null;
        LinkedList<ShareFileInfo> shareFileInfos=new LinkedList<ShareFileInfo>();
        RandonAccessFile raf = null;
        try {
            raf = new RandomAccessFile("SharedFile.db", "rw");
            long fileLen = raf.length();
            //obRead=new ObjectInputStream(new FileInputStream("SharedFile.db"));
            //while(true) {
            while (fileLen > 0) {
                int dataLen = raf.readInt();
                byte[] b = new byte[dataLen];
                if ((raf.read(b)) == -1) {break;}
                ByteArrayInputStream bis = new ByteArrayInputStream(b);
                obRead = new ObjectInputStream(bis);            file=(ShareFileInfo)obRead.readObject();
                shareFileInfos.add(file);            fileLen -= (b.length + 4);
            }
        } catch (IOException e) {
            // TODO: handle exception
            JOptionPane.showMessageDialog(null,"文件读入错误","错误提醒",JOptionPane.ERROR_MESSAGE);
        } catch(ClassNotFoundException e) {
            JOptionPane.showMessageDialog(null,"您尚未注册信息,请先注册账户","错误提醒",JOptionPane.ERROR_MESSAGE);
        } finally {
            try {
                if (raf != null) {
                    raf.close();
                }
            } catch (IOException e) {
                // TODO: handle exception
                JOptionPane.showMessageDialog(null,"文件关闭错误","错误提醒",JOptionPane.ERROR_MESSAGE);
            }
        }
        return shareFileInfos;
    }