Menyimpan Data ke File di Storage Internal

Object 'SharedPreferences' memungkinkan kita untuk menyimpan data yang idealnya disimpan sebagai pasangan antara 'name-dan-value', contohnya ID user, tanggal lahir, jenis kelamin, nomor KTP dan seterusnya. Tetapi terkadang kita perlu menggunakan sistem file untuk menyimpan data. Contohnya, kita mungkin ingin menyimpan teks puisi yang ingin ditampilkan dalam app kita. Di Android kita bisa menggunakan class-class dari package 'java.io' untuk diterapkan.

Menyimpan Data ke Storage Internal

Cara pertama untuk menyimpan file di app Android kita adalah dengan menulis ke storage internal perangkat. Berikut ini adalah contoh kode untuk menyimpan suatu string yang di-input oleh user ke storage internal perangkat.

File xml layout: activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> 
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Masukkan suatu kalimat" /> 
<EditText
android:id="@+id/txtText1"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> 
<Button
android:id="@+id/btnSave"
android:text="Simpan"
android:onClick="onClickSave"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> 
<Button
android:id="@+id/btnLoad"
android:text="Buka"
android:onClick="onClickLoad"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>

File java: MainActivity.java
package com.example.savefiles; 
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter; 
public class MainActivity extends AppCompatActivity {
EditText textBox;
static final int READ_BLOCK_SIZE = 100; 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textBox = (EditText) findViewById(R.id.txtText1);
public void onClickSave(View view) {
String str = textBox.getText().toString();
try
{
FileOutputStream fOut = openFileOutput("textfile.txt",MODE_PRIVATE);
OutputStreamWriter osw = new OutputStreamWriter(fOut); 
//--menulis string ke file--
osw.write(str);
osw.flush();
osw.close(); 
//--menampilkan pesan file sudah di-save--
Toast.makeText(getBaseContext(),"File sudah berhasil di-simpan",Toast.LENGTH_SHORT).show(); 
//membersihkan EditText
textBox.setText("");
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
public void onClickLoad(View view){
try
{
FileInputStream fIn = openFileInput("textfile.txt");
InputStreamReader isr = new InputStreamReader(fIn);
char[] inputBuffer = new char[READ_BLOCK_SIZE];
String s ="";
int charRead;
while ((charRead = isr.read(inputBuffer))>0)
{
//--konversi char ke String--
String readString = String.copyValueOf(inputBuffer,0,charRead);
s += readString;
inputBuffer = new char[READ_BLOCK_SIZE];
//--set EditText ke text yang sudah di-read--
textBox.setText(s);
Toast.makeText(getBaseContext(),"File berhasil di-buka", Toast.LENGTH_SHORT).show();
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}

Tampilan emulator menyimpan file
di Internal Storage
Silahkan jalankan di Android emulator di Android Studio. Kemudian ketikkan beberapa teks di 'EditText' dan kemudian klik tombol "Simpan". Bila file berhasil disimpan, kita akan melihat class 'Toast' akan menampilkan pesan "File sudah berhasil disimpan". Kemudian teks di 'EditText' hilang.

Bila kita klik tombol "Buka" maka kita akan melihat teks muncul lagi di 'EditText'. Ini berarti teks sudah benar-benar tersimpan dengan benar.

Penjelasan

Untuk menyimpan ke file, kita menggunakan class 'FileOutputStream'. Method openFileOutput() akan membuka file yang sudah diberi nama untuk ditulis, dengan 'mode' tertentu. Contohnya, kita menggunakan konstanta 'MODE_PRIVATE' untuk  menunjukkan bahwa file hanya bisa dibaca oleh app tertentu:




FileOutputStream fOut = openFileOutput("textfile.txt",MODE_PRIVATE);
Selain konstanta 'MODE_PRIVATE', kita bisa memilih beberapa yang lain: MODE_APPEND (untuk menulis ke file yang sudah ada), MODE_WORLD_READABLE (ini sudah di-deprecated karena dianggap sangat berbahaya dari sisi keamanan), dan MODE_WORLD_WRITEABLE (ini juga sudah di-deprecated karena dianggap sangat berbahaya dari sisi keamanan).

Untuk mengkonversi suatu 'character stream' menjadi 'byte stream', kita menggunakan instans dari class 'OutputStreamWriter', dengan melewatkan di dalamnya instans dari object 'FileOutputStream':
OutputStreamWriter osw = new OutputStreamWriter(fOut);
Kemudian kita menggunakan method 'write()' untuk menuliskan string ke file. Untuk memastikan bahwa semua bytes ditulis ke file, kita gunakan method 'flush()'. Dan terakhir kita gunakan 'close()' untuk menutup file:
//--menulis string ke file--
osw.write(str);
osw.flush();
osw.close();
Untuk membaca isi file, kita gunakan class 'FileInputStream', bersama dengan class 'InputStreamReader':
FileInputStream fIn = openFileInput("textfile.txt");
InputStreamReader isr = new InputStreamReader(fIn);
Karena kita tidak tahu ukuran file yang akan dibaca, isinya dibaca dalam blok-blok yang berisi 100 karakter ke dalam suatu 'buffer' (array karakter) Karakter yang dibaca kemudian di-copy menjadi object 'String':
char[] inputBuffer = new char[READ_BLOCK_SIZE];
String s = "";
int charRead;
while ((charRead = isr.read(inputBuffer)) > 0)
{
//--mengkonversi karakter ke String--
String readString = String.copyValueOf(inputBuffer, 0, charRead);
s += readString;
inputBuffer = new char[READ_BLOCK_SIZE];
}
Method 'read()' dari object 'InputStreamReader' men-cek jumlah karakter yang dibaca dan akan mengembalikan nilai -1 bila mencapai akhir file.

Ketika mencoba menjalankan app ini di Android emulator, kita bisa menggunakan DDMS untuk memverifikasi bahwa app sudah benar-benar menyimpan file ke directory app, seperti gambar di bawah ini.


No comments: