Appending to an ObjectOutputStream

前端 未结 6 1507
再見小時候
再見小時候 2020-11-22 03:00

Is it not possible to append to an ObjectOutputStream?

I am trying to append to a list of objects. Following snippet is a function that is called whenev

6条回答
  •  抹茶落季
    2020-11-22 03:41

    I have extended the accepted solution to create a class that can be used for both appending and creating new file.

    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.io.OutputStream;
    
    public class AppendableObjectOutputStream extends ObjectOutputStream {
    
        private boolean append;
        private boolean initialized;
        private DataOutputStream dout;
    
        protected AppendableObjectOutputStream(boolean append) throws IOException, SecurityException {
            super();
            this.append = append;
            this.initialized = true;
        }
    
        public AppendableObjectOutputStream(OutputStream out, boolean append) throws IOException {
            super(out);
            this.append = append;
            this.initialized = true;
            this.dout = new DataOutputStream(out);
            this.writeStreamHeader();
        }
    
        @Override
        protected void writeStreamHeader() throws IOException {
            if (!this.initialized || this.append) return;
            if (dout != null) {
                dout.writeShort(STREAM_MAGIC);
                dout.writeShort(STREAM_VERSION);
            }
        }
    
    }
    

    This class can be used as a direct extended replacement for ObjectOutputStream. We can use the class as follows:

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class ObjectWriter {
    
        public static void main(String[] args) {
    
            File file = new File("file.dat");
            boolean append = file.exists(); // if file exists then append, otherwise create new
    
            try (
                FileOutputStream fout = new FileOutputStream(file, append);
                AppendableObjectOutputStream oout = new AppendableObjectOutputStream(fout, append);
            ) {
                oout.writeObject(...); // replace "..." with serializable object to be written
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
    }
    

提交回复
热议问题