我正在为Android设计一个手写应用程序。
class LogInfo每当用户按下Enter键时,我都希望将信息()写入日志文件。
class LogInfo
之后,我想读取存储的信息。
这是我的类的一部分,带有自定义的write方法:
public class LogInfo implements Serializable { private static final long serialVersionUID = -5777674941129067422L; public static List<Point[][]> strokes; public static List<byte[]> 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循环中仅读取一个对象!
StreamCorruptedException
在主类中,我仅使用两种简单的方法:
// WRITE TO FILE logInfo.writeLog(); // READ FROM FILE ArrayList<LogInfo> 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<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; }
请求的更新:
//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() {} }
您不能附加到使用创建的现有文件中ObjectOutputStream,至少要费劲。关于扩展ObjectOutputStream和覆盖该writeStreamHeader()方法有一个技巧,以便不要第二次写入流头,但是我不赞成这样做。您应该真正重写整个文件,也许将其重写为列表。
ObjectOutputStream
writeStreamHeader()
您不需要所有这些代码。只需make strokes和codesnon-static和non-transient,就完全摆脱readObject()和writeObject()方法。
strokes
codes
readObject()
writeObject()