Menyimpan Data ke File di External Storage

Sebelumnya kita sudah latihan menyimpan file ke internal storage. Terkadang, kita juga ingin menyimpannya di external storage (misalnya SD card) karena kapasitasnya yang lebih besar dan kemudahannya untuk berbagi file dengan lebih mudah dengan user yang lain (dengan cara memindahkan SD card dan meminjamkan ke orang lain).

Dengan menggunakan kode yang sama dengan latihan sebelumnya tentang menyimpan file ke internal storage, kita akan memodifikasi sedikit pada bagian method 'onClickSave()' dari tombol 'Simpan' dan tambahkan satu method untuk men-cek apakah external storage tersedia untuk read dan write atau tidak (modifikasi ada di kode dengan huruf tebal):
/* Cek apakah external storage ada dan bisa untuk read dan write atau tidak */public boolean isExternalStorageWritable() {String state = Environment.getExternalStorageState();if (Environment.MEDIA_MOUNTED.equals(state)) {return true;}return false;}
public void onClickSave(View view) {
if (isExternalStorageWritable());{String str = textBox.getText().toString();try{//--SD Card Storage--File sdCard = Environment.getExternalStorageDirectory();File directory = new File(sdCard.getAbsolutePath() + "/myfiles");directory.mkdir();File file = new File(directory, "tes.txt");FileOutputStream fOut = new FileOutputStream(file);
//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();
}
}}

Kode di atas kita tambahkan satu method 'isExternalStorageWritable()' yang sebaiknya selalu kita gunakan untuk men-cek apakah external storage ada dan bisa dilakukan read dan write atau tidak. 

Kemudian selanjutnya kita gunakan method 'getExternalStorageDirectory()' untuk mendapatkan 'path' root ke external storage. Biasanya yang didapatkan adalah path "/sdcard" untuk perangkat riil, dan "/mnt/sdcard" untuk Android emulator. Tetapi seharusnya kita jangan pernah melakukan 'hardcode' path ke SD card karena masing-masing perusahaan akan membuat path yang berbeda-beda ke SD card. Jadi pastikan untuk selalu menggunakan method 'getExternalStorageDirectory()' untuk mendapatkan path root ke SD card.

Selanjutnya kita membuat directory 'myfiles' di SD card dan terakhir kita akan menyimpan file ke directory ini.

Untuk membukan file dari SD card, kita modifikasi method 'onClickLoad()' pada tombol 'Buka':
public void onClickLoad(View view){
if (isExternalStorageWritable());{
try
{
//--SD Storage--File sdCard = Environment.getExternalStorageDirectory();File directory = new File(sdCard.getAbsolutePath() + "/myfiles");File file = new File(directory,"tes.txt");FileInputStream fIn = new FileInputStream(file);InputStreamReader isr = new InputStreamReader(fIn); 

/*
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();
}
}}

Harap diperhatikan bahwa untuk menulis ke external storage kita perlu menambahkan permission 'WRITE_EXTERNAL_STORAGE' ke file 'AndroidManifest.xml'
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.savefiletosdcard">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"> 
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> 
</application>
</manifest>

Kode lengkap:

File layout  xml: 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.savefiletosdcard; 
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter; 
public class MainActivity extends Activity {
    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);
    } 
    /* Cek apakah external storage ada dan bisa untuk read dan write atau tidak */
    public boolean isExternalStorageWritable() {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            return true;
        }
        return false;
    }

    public void onClickSave(View view) {
        if (isExternalStorageWritable());{
        String str = textBox.getText().toString();
        try
        {
            //--SD Card Storage--
            File sdCard = Environment.getExternalStorageDirectory();
            File directory = new File(sdCard.getAbsolutePath() + "/myfiles");
            directory.mkdir();
            File file = new File(directory, "tes.txt");
            FileOutputStream fOut = new FileOutputStream(file);
            //FileOutputStream fOut = openFileOutput("tes.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){
        if (isExternalStorageWritable());{
        try
        {
            //--SD Storage--
            File sdCard = Environment.getExternalStorageDirectory();
            File directory = new File(sdCard.getAbsolutePath() + "/myfiles");
            File file = new File(directory,"tes.txt");
            FileInputStream fIn = new FileInputStream(file);
            InputStreamReader isr = new InputStreamReader(fIn);
            /*
            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();
        }
    }}
}

Hasil menyimpan ke SD Card di emulator


No comments: