1つの方法は、ArrayListに追加するクラスをシリアライズ可能に実装することです。クラスがシリアライズ可能も実装するオブジェクトのみで構成されている場合は、これで完了です(これはほとんどの場合です)。次のようにシリアライズ可能実装を追加するだけです。
public class myClass implements Serializable {
それ以外の場合は、以下の2つのメソッドをクラスに追加する必要があります
private void writeObject(java.io.ObjectOutputStream out) throws IOException
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException
AddはSerialibleを実装し、ObjectOutStreamがデータをストレージ用にシリアル化できることを通知します。
次に、以下のメソッドを実装してデータを保存して開くことができます。各ステップの機能に関するコメントを参照してください...
void saveArray(String filename, ArrayList<myClass> arrayToSave) {
FileOutputStream fos; //creates a file output stream to save your data
ObjectOutputStream oos; //creates an object output stream to serialize your data
try {
fos = openFileOutput(filename, Context.MODE_PRIVATE); //creates and opens file with the specified filename, Context.MODE_PRIVATE limits its visibility to your app, other modes are available
oos = new ObjectOutputStream(fos); //connects object output to file output
oos.writeObject(arrayToSave); //writes the object to the file
}
catch (FileNotFoundException e) {
//handle file not found
}
catch (IOException e) {
}
//handle I/O execption
oos.close(); //close object output stream
fos.close(); //close file output stream
}
ArrayList<myClass> openArray (String filename) {
ArrayList<myClass> array = null; //create ArrayList
FileInputStream fis; //create fileinput stream
ObjectInputStream ois; //create objet input stream
try {
fis = openFileInput(filename); //open file stream
ois = new ObjectInputStream(fis); //open object stream
array = (ArrayList<myClass>)ois.readObject(); //create object from stream
}
catch (Exception e) {
System.out.println(e.toString());
}
ois.close(); //close objectinput stream
fis.close(); //close fileinput stream
return array;
}
最後に、ファイルの入出力ストリームは両方ともbufferedinputstream / bufferedoutputストリームでラップできますが、小さなファイルではパフォーマンスにあまり影響しないことがわかりました。それはによって達成することができます
BufferedInputStream bufIn = new BufferedInputStream(new FileInputStream("file.java"));
BufferedOutputStream bufOut = new BufferedOutputStream(new FileInputStream("file.java"));
さて、以下はこれを実証するための完全なアクティビティファイルであり、バージョン2.1でテストされています...変更する必要があるのはプロジェクトに一致するパッケージ名だけです...これによりsaveDataの変数がからパッケージに変更されることに注意してくださいプライベート、プライベートにしておきたい場合は、おそらくそうすべきですが、セッター/ゲッターを実装する必要がありますが、以下のコードは、オブジェクトの保存/ロードを理解するのに役立ちます...
package youpackage.name.myapp;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
class saveData implements Serializable {
private static final long serialVersionUID = 1L;
private final int version = 101002;
String title;
int[] Int1 = new int[3];
int[] Int2 = new int[3];
int[] Int3 = new int[3];
int Int;
}
public class MyAppActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println("This next line creates instance of class to save");
saveData mySaveData = new saveData();
System.out.println("This next line sets the title...");
mySaveData.title = "accept my answer...";
ArrayList<saveData> myArrayList = new ArrayList<saveData>();
System.out.println("This next line adds the object to the ArrayList");
myArrayList.add(mySaveData);
System.out.println("This next line saves the arraylist");
saveArray("myFilename", myArrayList);
System.out.println("This next line loads the arraylist back...");
ArrayList<saveData> retrieveArrayList = openArray("myFilename");
if (retrieveArrayList.size() > 0) {
saveData retrievedSaveData = retrieveArrayList.get(0);
System.out.println("if successful, the title set above will appear...");
System.out.println("if save/retrieve works, then " + retrievedSaveData.title);
}
else {
System.out.println("it did not work");
}
}
void saveArray(String filename, ArrayList<saveData> arrayToSave) {
FileOutputStream fos;
ObjectOutputStream oos;
try {
fos = openFileOutput(filename, Context.MODE_PRIVATE);
oos = new ObjectOutputStream(fos);
oos.writeObject(arrayToSave);
oos.close();
fos.close();
} catch (Exception e) {
System.out.println(e.toString());
}
}
ArrayList<saveData> openArray (String filename) {
ArrayList<saveData> array = null;
FileInputStream fis;
ObjectInputStream ois;
try {
fis = openFileInput(filename);
ois = new ObjectInputStream(fis);
array = (ArrayList<saveData>)ois.readObject();
ois.close();
fis.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return array;
}
}
前回の投稿で述べたように、ロードと保存の以下の更新されたメソッドはパフォーマンスを向上させます...
void saveArray2(String filename, ArrayList<saveData> arrayToSave) {
try {
BufferedOutputStream bos = new BufferedOutputStream(openFileOutput(filename, Context.MODE_PRIVATE),8000);
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(arrayToSave);
oos.close();
} catch (Exception e) {
System.out.println(e.toString());
}
}
ArrayList<saveData> openArray2 (String filename) {
ArrayList<saveData> array = null;
try {
BufferedInputStream bufIn = new BufferedInputStream(openFileInput(filename),8000);
ObjectInputStream ois = new ObjectInputStream(bufIn);
array = (ArrayList<saveData>)ois.readObject();
ois.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return array;
}