0

こんにちは、私は深刻な問題を抱えており、シリアライズ可能なオブジェクトをローカルの Android ファイル システム上のファイルに永続化しようとしています。不正なファイル記述子エラーが発生しています。これは、ファイルを作成する方法に関係していると思います。ファイルが存在するかどうかを確認します。クラスにプライベート ファイル オブジェクトを作成します。次に、書き込み時または読み取り時。次のコードでファイルの存在を確認します。

@Override
public boolean fileExists() {

    File file = context.getFileStreamPath(filename);
    return file.exists();
}

これは、「objectfile」と呼ばれる私のファイルオブジェクトをインスタンス化しません!! ただし、「ファイル名」が存在することを確認します。

ファイルを作成するには、「ファイル名」が存在しない場合にこのメソッドを呼び出します。

  public void createFile()
 {
    objectfile = new File(context.getFilesDir(), filename);
    objectfile.setReadable(true);
    objectfile.setWritable(true);
 }

これにより、以前に作成したファイルが返されるかどうかはわかりませんが、これは理想的にはやりたいことです。古いファイルを取得するか、新しいファイルを作成してコンストラクターの「objectfile」変数に渡す方法はありますか??

これを行うための最良の方法は何ですか?? または、mysqlite db を使用する必要がありますか? オブジェクトファイルの永続化を使用することは、今のところうまくいかないようで、締め切りまで取り組んでいます。また、この方法はグーグルのドキュメントで言及されているので、それを行うことは合法だと思いました。

http://developer.android.com/training/basics/data-storage/files.html

ここに、シリアライズ可能なオブジェクトを読み取るための私の方法があります

public synchronized ArrayList<RoomItem> readObjects() {

    final ArrayList<RoomItem> readlist =  new ArrayList<>();

    if(!fileExists())
        return readlist;

    if(objectfile == null)
        createFile();

    try {

        finputstream = new FileInputStream(objectfile);
        instream = new ObjectInputStream(finputstream);

        readwritethread = new Thread(new Runnable() {
            @Override
            public void run() {

            try {

                    final ArrayList<RoomItem> readitems  = (ArrayList<RoomItem>)  instream.readObject();

                    instream.close();
                    finputstream.close();

                    handler.post(new Runnable() {
                        @Override
                        public void run() {

                            listener.updateList(readitems);
                       }
                    });

                } catch(IOException e)
                {
                    e.printStackTrace();
                }
                catch(ClassNotFoundException e)
                {
                    e.printStackTrace();
                    Log.d("read failed", "file read failed");
                }
            }
        });

    }
    catch(Exception e)
    {
        e.printStackTrace();
    }


    timeOutReadWrite(readwritethread);
    readwritethread.start();
    try {
        readwritethread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    Log.d("read from file", "file read");
    return readlist;

誰かが改善点を提案できれば、本当に感謝しています。ハンドラーを使用してアクティビティに戻し、すべての obj が読み取られたときにアクティビティを呼び出すリスナー インターフェイスをアクティビティに実装します。再度、感謝します!

4

2 に答える 2

0

1#: はい、作成した元のファイルが返されます。2#: 保存したいものによって異なりますが、ファイルは説明より柔軟なようです

役立つことを願っています。

于 2015-12-04T13:11:51.497 に答える
0

私たちは使用しました

FileOutputStream fos = context.openFileOutput("file.ser", Context.MODE_PRIVATE);

シリアル化されたファイルを書き込みます。これにより、/data/data/app.package.name/files/ 内のファイルが削除されます。実際、このパスは getFilesDir() によって返されます。

そして、デシリアライズ中に、使用します

//openFileOutput() に渡されたものと同じファイルを必ず渡してください。 FileInputStream fis = context.openFileInput("file.ser");

また、ファイル名の混乱を避けるために、シリアル化されているクラスの名前を使用できます。

元:

public static <T> void serialize(final Context context, final T objectToSerialize) {
....
....
Strin fileName = objectToSerialize.getClass().getSimpleName();

...
}

これを実行し、メソッドを util に保持して、任意のタイプのオブジェクト (T タイプ) でシリアライズするために使用できるようにします。

于 2015-12-04T19:54:29.317 に答える