0

我有以下问题。我正在设计手写应用程序。我不知道如何将我的对象(LogInfo)写入和读取到文件中。我知道我应该重写 write 和 read 方法,但我仍然不知道该怎么做。谁能给我明确的回答我的问题?

我的班级如下:

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import android.graphics.Point;

public class LogInfo implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = -5777674941129067422L;
    transient public static List<Point[][]> strokes;
    transient public static List<byte[]> codes;

    public LogInfo()
    {
        strokes = new ArrayList<Point[][]>();
        codes = new LinkedList<byte[]>();
    }

    private synchronized void writeObject(ObjectOutputStream stream) throws IOException {
        stream.defaultWriteObject();
        //stream.writeInt(strokes.size());
        //Point[][] pointsArray;
        //for (int i=0; i<strokes.size(); i++)
        //{
        //  pointsArray = ((Point[][])strokes.get(i));
        //  for (int j = 0; j < pointsArray.length; j++)
        //      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]);
        //      }
        //}
        stream.writeInt(codes.size());
        for (int i=0; i<codes.size(); i++)
        {
            stream.write(codes.get(i));
        }
    }

    private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException
    {
        stream.defaultReadObject();
        int codesSize = stream.readInt();
        for (int i=0; i<codesSize; i++)
        {
            byte[] buffer = null;
            stream.read(buffer, 0, 3);
            codes.add(buffer);
        }
    }
}

Strokes 是一个 ArrayList 包含 Point 类型的二维数组(对应于笔画编号和与之相关的点)

Codes 是一个数组,我在其中存储字符(3 个字节 = 1 个字符)

因此,如果我使用 2 个笔画写“A”,笔画和代码大小为 2,并且代码包含写在 3 个字节上的字符 A。

有人可以告诉我如何编写和阅读这些对象吗?

4

2 回答 2

0

由于 Point 不可序列化。您可以拥有一个自定义的“点”类,其中包含 x 和 y 以及从它派生的瞬态点。这样,您可以使用默认的 readObject 和 writeObject。

看一下这个

于 2013-05-09T01:09:02.477 回答
0

我想我已经找到了解决办法。

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) throws IOException, ClassNotFoundException
{
    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);
    }
}

它对我来说效果很好。

于 2013-05-10T00:58:47.853 回答