Android-Programmierung Files
Willemers Informatik-Ecke

Datei-Ressourcen

Wenn die App Dateien verwenden soll, die nicht verändert werden sollen, sondern als Ressourcen nur gelesen werden sollen und nach der Installation zur Verfügung stehen sollen, packt man diese in das Verzeichnis res/raw. Diese können über den Aufruf openRawResource gelesen werden.
Resources myRsc = getResources();
InputStream in = rsc.openRawResource(R.raw.myRsc);

Objekte speichern

Soll ein Datenobjekt den Wechsel einer Activity überleben, kann sie in einer Datei im eigenen Dateiverzeichnis abgelegt werden. Jede App hat ihr eigenes Datenverzeichnis, auf das andere Apps nicht zugreifen können. Aus diesem Grund ist der Zugriff auch permission-frei.

Voraussetzung für das Objekt

Um das Objekt durch einen Stream sichern zu können, muss es serialisierbar sein. Das ist in der Regel bei allen Datenobjekten der Fall. Damit der Compiler dies prüfen kann, muss die Klasse explizit das Interface Serializable implementieren.

public class DatenKlasse implements Serializable {
// ...
Es müssen keine abstrakten Methoden implementiert werden. Ein Objekt dieser Klasse wird ganz normal erzeugt wie bei jeder anderen Klasse auch.
DatenKlasse meinObjekt = new DatenKlasse();

Das Sichern eines Objekts

Wie bei allen Dateioperationen von Java wird auch bei Android ein Datenstrom verwendet, beim Schreiben wird dazu die Klasse FileOutputStream verwendet.

Damit können bereits Strings geschrieben werden. Da nun aber ein Objekt in die Datei soll, muss für dieses Objekt erst einmal ein Stream geschaffen werden, der von der Klasse ObjectOutputStream ist. Über dieses Objekt kann dann writeObject gerufen werden, das endlich das Objekt übernimmt.

private static final String TAG = "MeineApp";
// ...
try {
    FileOutputStream fos = this.openFileOutput(dateiname, Context.MODE_PRIVATE);
    ObjectOutputStream os = new ObjectOutputStream(fos);
    os.writeObject(meinObjekt);
    fos.close();
} catch (FileNotFoundException e) {
    Log.d(TAG, "FileNotFound: "+e.toString());
} catch (IOException e) {
    Log.d(TAG, "IOException: "+e.toString());
}

Das Zurückladen eines Objekts

Um das Objekt aus der Datei wieder zurückzuholen, wird ein Datei-Stream zum Lesen erzeugt, über den ein ObjectInputStream die Daten aus der Datei durch die Methode readObject liest. Der Rückgabewert ist ein Object und muss darum auf die eigene Objektklasse gecastet werden.
try {
    FileInputStream fis = openFileInput(dateiname);
    ObjectInputStream is = new ObjectInputStream(fis);
    meinObjekt = (DatenKlasse) is.readObject();
} catch (FileNotFoundException e) {
    Log.d(TAG, "FileNotFound: "+e.toString());
} catch (IOException e) {
    Log.d(TAG, "IOException: "+e.toString());
} catch (ClassNotFoundException e) {
    Log.d(TAG, "ClassNotFound: "+e.toString());
}

Eigenes Dateiverzeichnis

Das Basisverzeichnis einer App ermittelt man über das Environment.
File data = Environment.getDataDirectory(); // /data
String  meinPfad = Environment.getDataDirectory() + "/data/" + getPackageName();
Der Aufruf von Environment.getExternalStoragePublicDirectory() liefert den Verweis auf die öffentlichen Verzeichnisse des externen Speichers.

Datei-Operationen

Datei kopieren

File fileIn = new File(dateinameIn);
File fileOut = new File(dateinameOut);
FileChannel src = new FileInputStream(fileIn).getChannel();
FileChannel dst = new FileOutputStream(fileOut).getChannel();
dst.transferFrom(src, 0, src.size());
src.close();
dst.close();