こんにちは、私は深刻な問題を抱えており、シリアライズ可能なオブジェクトをローカルの 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 が読み取られたときにアクティビティを呼び出すリスナー インターフェイスをアクティビティに実装します。再度、感謝します!