写入和读取多个对象到文件

我正在为android设计一个手写应用程序。

每次用户按下回车键时,我class LogInfo将信息( class LogInfo )写入日志文件。

之后,我想阅读存储的信息。

这是我的类的一部分,具有自定义写入方法:

 public class LogInfo implements Serializable { private static final long serialVersionUID = -5777674941129067422L; public static List strokes; public static List codes; // Only write and read methods shown private void writeObject(ObjectOutputStream stream) throws IOException { stream.defaultWriteObject(); stream.writeInt(strokes.size()); Point[][] pointsArray = null; for (int i = 0; i < strokes.size(); i++) { pointsArray = ((Point[][])strokes.get(i)); stream.writeInt(pointsArray.length); for (int j = 0; j < pointsArray.length; j++) { stream.writeInt(pointsArray[j].length); for (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); for (int i = 0; i < size; i++) { stream.write(codes.get(i)); } } 

这是读取方法:

 private void readObject(java.io.ObjectInputStream stream) { stream.defaultReadObject(); int strokesSize = stream.readInt(); for (int i = 0; i < strokesSize; i++) { int arrayXSize = stream.readInt(); Point[][] points = new Point[arrayXSize][]; for (int j = 0; j < arrayXSize; j++) { int arrayYSize = stream.readInt(); points[j] = new Point[arrayYSize]; for (int k = 0; k < arrayYSize; k++) points[j][k] = new Point(stream.readInt(), stream.readInt()); } strokes.add(points); } int codesSize = stream.readInt(); for (int i = 0; i < codesSize; i++) { byte[] buffer = new byte[3]; stream.read(buffer, 0, 3); codes.add(buffer); } } 

当我在文件中只保存一个对象时,它运行良好。 当我尝试保存更多时,读取不起作用(它会抛出StreamCorruptedException )。 它只读取while循环中的一个对象!

在主类中,我只使用两个简单的方法:

 // WRITE TO FILE logInfo.writeLog(); // READ FROM FILE ArrayList logInfoArrayList = logInfo.readLog(); 

定义为:

 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 readLog() { ArrayList logInfoArray = new ArrayList(); 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; } 

请求更新:

 //We use this class to not write a header in a file that already exist class MyObjectOutputStream extends ObjectOutputStream { public MyObjectOutputStream(OutputStream os) throws IOException { super(os); } @Override protected void writeStreamHeader() {} } 

  1. 您无法附加到使用ObjectOutputStream创建的现有文件,至少不会毫不费力。 有一个关于扩展ObjectOutputStream和覆盖writeStreamHeader()方法的技巧,以便不第二次写入流头,但我并不赞成它。 你应该真的重写整个文件,可能是一个List。

  2. 您不需要所有这些代码。 只需使strokescodes非静态和非瞬态,并完全摆脱readObject()writeObject()方法。

@EJP是right.it无法附加到使用ObjectOutputStream创建的现有文件。 您可以执行以下步骤来修复它:1。保持ObjectOutputStream对象引用2.在调用writeObject()之后,不要调用close()3。提供关闭ObjectOutputStream的方法。

有一种方法可以将多个对象保存在一个文件中:首先应该创建一个对象数组( Object [] objects ),然后将对象作为Object逐个放入此数组中,然后使用writeObject(objects)编写此数组writeObject(objects)方法。 祝你好运。