java - Write and read multiple objects to file -


i designing handwriting application android.

i write information (class loginfo) log file, every time user presses enter button.

after that, read stored information.

this part of class custom write method:

public class loginfo implements serializable {  private static final long serialversionuid = -5777674941129067422l;  public static list<point[][]> strokes; public static list<byte[]> codes;  // write , read methods shown  private void writeobject(objectoutputstream stream) throws ioexception {     stream.defaultwriteobject();     stream.writeint(strokes.size());     point[][] pointsarray = null;     (int = 0; < strokes.size(); i++)     {         pointsarray = ((point[][])strokes.get(i));         stream.writeint(pointsarray.length);         (int j = 0; j < pointsarray.length; j++)         {             stream.writeint(pointsarray[j].length);             (int k = 0; k < pointsarray[j].length; k++)             {                 stream.writeint(pointsarray[j][k].x);                 stream.writeint(pointsarray[j][k].y);                 //stream.writeobject(elementdata[i]);             }         }     }      int size = codes.size();     stream.writeint(size);     (int = 0; < size; i++)     {         stream.write(codes.get(i));     } } 

this read method:

private void readobject(java.io.objectinputstream stream)     {         stream.defaultreadobject();         int strokessize = stream.readint();         (int = 0; < strokessize; i++)         {             int arrayxsize = stream.readint();             point[][] points = new point[arrayxsize][];             (int j = 0; j < arrayxsize; j++)             {                 int arrayysize = stream.readint();                 points[j] = new point[arrayysize];                 (int k = 0; k < arrayysize; k++)                     points[j][k] = new point(stream.readint(), stream.readint());             }             strokes.add(points);         }          int codessize = stream.readint();         (int = 0; < codessize; i++)         {             byte[] buffer = new byte[3];             stream.read(buffer, 0, 3);             codes.add(buffer);         }     } 

it works when save 1 object in file. when try save more, reading not working (it throws streamcorruptedexception). it reads 1 object in while loop!

in main class, use 2 simple methods:

// write file loginfo.writelog();  // read file arraylist<loginfo> loginfoarraylist = loginfo.readlog(); 

defined as:

public void writelog() {     file file = new file (environment.getexternalstoragedirectory().getabsolutepath(), "data.log");     fileoutputstream fos;     try {         fos = new fileoutputstream(file, true);         //fos = openfileoutput(environment.getexternalstoragedirectory().getabsolutepath() + "/data.log", context.mode_append);         objectoutputstream os = new objectoutputstream(fos);         os.writeobject(this);         os.close();      } catch (ioexception e) {         // todo auto-generated catch block         e.printstacktrace();     } }  public arraylist<loginfo> readlog() {     arraylist<loginfo> loginfoarray = new arraylist<loginfo>();      try{         file file = new file (environment.getexternalstoragedirectory().getabsolutepath(), "data.log");         fileinputstream fis  = new fileinputstream(file);         objectinputstream reader = new objectinputstream(fis);            loginfo temploginfo = new loginfo();         while((temploginfo = (loginfo)reader.readobject()) != null)             loginfoarray.add(temploginfo);         reader.close();     } catch (exception e) {      //todo auto-generated catch block      e.printstacktrace();     }      return loginfoarray; } 

requested update:

//we use class not write header in file exist class myobjectoutputstream extends objectoutputstream {      public myobjectoutputstream(outputstream os) throws ioexception {         super(os);       }      @override     protected void writestreamheader() {} } 

  1. you can't append existing file created objectoutputstream, @ least not without effort. there trick somewhere extending objectoutputstream , overriding writestreamheader() method not write stream header second time, i'm not in favour of it. should rewrite whole file, maybe list.

  2. you don't need code. make strokes , codes non-static , non-transient, , rid of readobject() , writeobject() methods altogether.


Comments

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

c++ - qgraphicsview horizontal scrolling always has a vertical delta -