Android: Menyimpan file

Android menyediakan tiga cara untuk menyimpan data di device. Jika hanya untuk menyimpan sedikit data (beberapa variabel), gunakan shared preferences.  Jika data cukup kompleks dan sering memerlukan pencarian (akses random), gunakan database. Jika ukuran datanya besar,  tidak perlu pencarian, dapat dishare di SD card untuk dibaca komputer, atau memerlukan format yang yang sangat spesifik, gunakan file seperti yang akan dibahas di posting ini.

File dapat disimpan baik di dalam device (internal) maupun eksternal (SD card).  Perbedaan penyimpanan internal dan eksternal dapat dilihat di tabel berikut

InternalEksternal
Selalu tersediaBelum tentu, user bisa mencabut SD Card
Secara default, tidak dapat diakses oleh app lainBisa diakses oleh siapa saja
Jika app diuninstall, akan ikut terhapus.Tidak terhapus, kecuali disimpan di tempat yang diperoleh dari method getExternalFilesDir
Tidak dapat diakses oleh app lainDapat diakses oleh app lain, termasuk oleh komputer.
Tidak memerlukan permissionMemerlukan permission di manifest

Internal cocok untuk data yang tidak perlu dibaca app lain, sedangkan eksternal cocok jika data berukuran sangat besar atau data tidak masalah dibaca app lain termasuk untuk diakses komputer.

Bagi anda yang telah mengenal stream dan file di Java, anda dapat membaca secara cepat tutorial ini, karena tidak ada perbedaan antara Java dan Android. Class yang mensupport operasi file disediakan di package java.io.*

Pada tutorial ini kita akan menyimpan file teks di media penyimpanan eksternal.

Pertama tambahkan permission untuk menulis di media eksternal

<manifest ...>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    ...
</manifest>

Tambahkan code berikut dibagian create


protected void onCreate(Bundle savedInstanceState) {
        //.. code create

   
        //debug untuk melihat tempat penyimpanan
        AlertDialog d= new AlertDialog.Builder(this).create();
        d.setMessage("Dibuat di dir"+getApplicationContext().getExternalFilesDir(null));
        d.show();

        //siapkan file hasil.txt untuk ditulis
        File fileOut = new File(getApplicationContext().getExternalFilesDir(null),"hasil.txt");
        try {
            PrintWriter pw = new PrintWriter(fileOut);
            pw.println("Data baris 1");
            pw.println("Data baris 2");
            pw.close();
            AlertDialog dialog = new AlertDialog.Builder(this).create();
            dialog.setMessage("data selesai ditulis");
            dialog.show();
        } catch (Exception ex) {
            Log.e("yw", ex.getMessage());
        }

        //baca data
        File fileInput = new File(getApplicationContext().getExternalFilesDir(null),"hasil.txt");
        try {
            Scanner sc = new Scanner(fileInput);
            String strBaris;
            StringBuilder sb = new StringBuilder(); //untuk menampung string
            while (sc.hasNextLine()) {
                strBaris = sc.nextLine(); //ambil satu baris
                sb.append(strBaris);
            }
            AlertDialog dialog = new AlertDialog.Builder(this).create();
            dialog.setMessage("data yg dibaca: "+sb.toString());
            dialog.show();
        } catch (FileNotFoundException ex) {
            Log.e("yw", ex.getMessage());
        }

    }

Jalankan, maka akan ditampilkan lokasi data (di hp saya: dir/storage/emulated/0/Android/data/[package app]/files ) dan data yang berhasil dibaca. Lokasi ini sifatnya dapat diakses siapapun, jika kita hubungkan HP dengan komputer, maka kita dapat mengambil file hasil.txt ini. Karena lokasi diambil dengan getExternalFilesDir, jika app diuninstall maka isi dari direktori ini juga akan ikut dihapus.

Karena media eksternal belum tentu tersedia (misal sedang dikeluarkan), maka sebaiknya perlu dicek dulu apakah tersedia atau tidak. Jika output dari method getExternalStorageState menghasilkan MEDIA_MOUNTED maka artinya media siap dibaca dan ditulis. Berikut contohnya.

    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;  //bisa digunakan
    }

Internal
Bagaimana jika kita ingin menulis file di media internal? Intinya hanya mengganti lokasi tempat penyimpanan.
Ada dua method yang dapat digunakan

getFilesDir(): menghasilkan direktori internal app
getCacheDir(): menghasilkan direktori internal untuk cache. Anggap saja cache ini sebagai direktori sementara untuk menyimpan file-file sementara yang dapat dihapus jika proses sudah selesai. Android dapat menghapus isi cache ini secara otomatis jika kapasitas menipis, walaupun sebaiknya app sendiri yang membersihkan isi cache jika sudah tidak digunakan.

Untuk mencoba, silahkan ganti getExternalFilesDir pada code sebelumnya dengan getFilesDir()

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.