4

Android用の手書きアプリケーションを設計しています。

class LogInfoユーザーが入力ボタンを押すたびに、情報 ( ) をログ ファイルに書き込みたいと考えています。

その後、保存された情報を読みたいと思います。

これは、カスタム書き込みメソッドを持つ私のクラスの一部です:

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);
        }
    }

ファイルにオブジェクトを 1 つだけ保存するとうまくいきます。さらに保存しようとすると、読み取りが機能しません (スローされますStreamCorruptedException)。while ループで 1 つのオブジェクトのみを読み取ります。

メイン クラスでは、次の 2 つの単純なメソッドを使用するだけです。

// 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() {}
}
4

3 に答える 3

5
  1. ObjectOutputStream少なくとも努力なしでは、で作成された既存のファイルに追加することはできません。ObjectOutputStream2 回目にストリーム ヘッダーを書き込まないように、メソッドを拡張してオーバーライドすることについてどこかにトリックがありますwriteStreamHeader()が、私はそれを支持しません。おそらくリストとして、ファイル全体を実際に書き換える必要があります。

  2. このすべてのコードは必要ありません。andを非静的strokesかつcodes非一時的に作成し、readObject()andwriteObject()メソッドを完全に削除します。

于 2013-05-10T02:16:39.117 に答える
0

複数のオブジェクトを 1 つのファイルに保存する方法があります。最初にオブジェクト配列 ( Object [] objects) を作成し、次にオブジェクトを 1 つずつオブジェクトとしてこの配列に配置し、writeObject(objects)メソッドを使用してこの配列を書き込む必要があります。幸運を。

于 2016-05-15T18:30:37.350 に答える
0

@EJP は正しいです。ObjectOutputStream で作成された既存のファイルに追加することはできません。これを修正するには、次の手順を実行します。 1. ObjectOutputStream オブジェクト参照を保持します。 2. writeObject() が呼び出された後は、close() を呼び出さないでください。 3. ObjectOutputStream を閉じるメソッドを提供します。

于 2013-08-03T15:18:02.363 に答える