มือถือทุกเครื่องจะมีพื้นที่เก็บข้อมูลอยู่ในตัว เรียกว่า "เมมภายใน"
และบางเครื่องใส่ MicroSD ไว้ เรียกว่า "เมมภายนอก"
เราสามารถเลือกเขียนไฟล์ไว้ใน "เมมภายใน" หรือ "เมมภายนอก" ก็ได้
มือถือแต่ละเครื่องจะมีขนาดพื้นที่ไม่เท่ากัน รุ่นเก่าๆอาจมี "เมมภายใน" แค่ 200 MB
อาจจะใส่ "เมมภายนอก" 8 GB หรืออาจไม่ใส่เลยก็ได้
หากเราเขียน App ขนาดใหญ่ เก็บไฟล์จำนวนมากไว้ใน "เมมภายใน"
มือถือที่มีพื้นที่น้อย จะรัน App ของเราไม่ได้
ดังนั้น เราจึงต้องเลือกตำแหน่งเก็บไฟล์ ให้เหมาะสมกับการใช้งาน
หากเราต้องการเขียนไฟล์ไว้ใน "เมมภายใน" เราเลือกบันทึกได้ 2 แบบ
1.
internal private folder - แบบส่วนตัว เฉพาะ App ของเราเท่านั้นที่เข้าไปอ่านเขียนได้
2.
internal cache folder - แบบชั่วคราว ระบบสามารถลบทิ้งได้ ถ้าต้องการพื้นที่ว่าง
ทั้ง 2 แบบ เมื่อผู้ใช้ลบ App ไฟล์จะถูกลบไปด้วย
หากเราต้องการเขียนไฟล์ไว้ใน "เมมภายนอก" เราเลือกบันทึกได้ 3 แบบ
1.
external private folder - แบบส่วนตัว เมื่อผู้ใช้ลบ App ไฟล์นี้จะถูกลบไปด้วย
2.
external public folder - แบบสาธารณะ เมื่อผู้ใช้ลบ App ไฟล์นี้จะยังอยู่
3.
external cache folder - แบบชั่วคราว ระบบสามารถลบทิ้งได้ ถ้าต้องการพื้นที่ว่าง
นอกจากนี้หากเราต้องการเก็บไฟล์ตามประเภทของไฟล์ เช่น Picture, Video ก็ยังเลือกได้อีก คือ
1.
external private picture - เก็บ "ไฟล์รูปภาพ" ไว้ใน "เมมภายนอก" ในแบบส่วนตัว
2.
external public picture - เก็บ "ไฟล์รูปภาพ" ไว้ใน "เมมภายนอก" ในแบบสาธารณะ
AndroidManifest.xml
บรรทัดที่ 7 : ขออนุญาติอ่านเขียน "เมมภายนอก"
บรรทัดที่ 3 : กำหนดให้ App ของเรา สามารถติดตั้งใน "เมมภายนอก" ได้
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp"
android:installLocation="preferExternal"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>
เราใช้คำสั่งนี้ เพื่อเช็คว่ามี "เมมภายนอก" หรือไม่
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
Toast.makeText(MainActivity.this, "มีเมมภายนอก", Toast.LENGTH_LONG).show(); }
if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
Toast.makeText(MainActivity.this, "เมมภายนอก อ่านได้อย่างเดียว", Toast.LENGTH_LONG).show(); }
วิธีเขียนไฟล์ไว้ใน "เมมภายนอก" (แก้ไข MainActivity.java ตามนี้)
package com.example.myapp;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
File path1 = getExternalCacheDir();
Toast.makeText(MainActivity.this, path1.toString(), Toast.LENGTH_LONG).show();
String u1 = path1.toString() + "/readme.txt";
String u2 = "<name>ทดสอบ</name>\r\n<email>ฝนตก</email>\r\n";
String u3 = "";
// เขียนไฟล์
try {
File file = new File(u1);
if (!file.exists()) { file.createNewFile(); }
FileWriter writer = new FileWriter(file, true); //True = Append to file, false = Overwrite
writer.write(u2);
writer.close();
Toast.makeText(MainActivity.this, "File Save!", Toast.LENGTH_LONG).show();
} catch (IOException e) { e.printStackTrace(); }
// อ่านไฟล์ทีละบรรทัด
try {
File file = new File(u1);
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) { u3 += line + "\r\n"; }
br.close();
Toast.makeText(MainActivity.this, u3, Toast.LENGTH_LONG).show();
} catch (IOException e) { e.printStackTrace(); }
// อ่านไฟล์
try {
File file = new File(u1);
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int n; u3="";
while ((n = fis.read(buffer)) != -1) {
u3=u3 + new String(buffer, 0, n);
}
fis.close();
Toast.makeText(MainActivity.this, u3, Toast.LENGTH_LONG).show();
} catch (IOException e) { e.printStackTrace(); }
}
});
}
}
บรรทัดที่ 27 สามารถเปลี่ยนเป็นคำสั่งข้างล่างนี้ได้
สรุปฟังค์ชั่นหาค่า Path
internal private folder
path1 = getFilesDir();
data/data/com.example.myapp/files
internal cache folder
path1 = getCacheDir();
data/data/com.example.myapp/cache
external private folder
path1 = getExternalFilesDir(null);
storage/sdcard0/Android/data/com.example.myapp/files
external private picture
path1 = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
storage/sdcard0/Android/data/com.example.myapp/files/Pictures
external cache folder
path1 = getExternalCacheDir();
storage/sdcard0/Android/data/com.example.myapp/cache
external public folder
path1 = Environment.getExternalStorageDirectory();
storage/sdcard0
external public picture
path1 = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES);
storage/sdcard0/Pictures
วิธีเขียนไฟล์ไว้ใน "เมมภายใน" (แก้ไข MainActivity.java ตามนี้)
package com.example.myapp;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String u1 = "readme.txt";
String u2 = "<name>ทดสอบ</name>\r\n";
// เขียนไฟล์
try {
FileOutputStream fos = openFileOutput(u1, MODE_APPEND);
fos.write(u2.getBytes());
fos.close();
Toast.makeText(MainActivity.this, "File Save!", Toast.LENGTH_LONG).show();
} catch (Exception e) { e.printStackTrace(); }
// อ่านไฟล์
try {
FileInputStream fis = openFileInput(u1);
StringBuffer data = new StringBuffer("");
byte[] buffer = new byte[1024];
int n;
while ((n = fis.read(buffer)) != -1) {
data.append(new String(buffer, 0, n));
}
fis.close();
Toast.makeText(MainActivity.this, data.toString(), Toast.LENGTH_LONG).show();
} catch (Exception e) { e.printStackTrace(); }
// อ่านไฟล์ทีละบรรทัด
try {
FileInputStream fos = openFileInput(u1);
BufferedReader reader = new BufferedReader(new InputStreamReader(fos));
String line = null, u3 = "";
while ((line = reader.readLine()) != null) { u3 += line + "\r\n"; }
reader.close();
fos.close();
Toast.makeText(MainActivity.this, u3, Toast.LENGTH_LONG).show();
} catch (Exception e) { e.printStackTrace(); }
}
});
}
}
บรรทัดที่ 30 สามารถเลือกได้ 4 โหมด คือ
MODE_PRIVATE : เฉพาะ App ของเราที่อ่านเขียนได้ + ถ้ามีไฟล์อยู่แล้ว ให้เขียนทับ
MODE_APPEND : เฉพาะ App ของเราที่อ่านเขียนได้ + ถ้ามีไฟล์อยู่แล้ว ให้เขียนต่อท้ายไฟล์
MODE_WORLD_READABLE : อนุญาติให้คนอื่น "อ่าน" ไฟล์ของเราได้
MODE_WORLD_WRITEABLE : อนุญาติให้คนอื่น "อ่าน", "เขียน" ไฟล์ของเราได้
หาพื้นที่ว่าง และ พื้นที่ทั้งหมด
File path1 = getExternalCacheDir();
long i1 = path1.getTotalSpace();
long i2 = path1.getFreeSpace();
Toast.makeText(MainActivity.this, "Total : " + i1 + "\r\n Free : " + i2, Toast.LENGTH_LONG).show();
ลบไฟล์
File path1 = getExternalCacheDir();
String u1 = path1.toString() + "/readme.txt";
File file = new File(u1);
boolean deleted = file.delete();
แสดงรายชื่อไฟล์
File path1 = getExternalCacheDir();
Toast.makeText(MainActivity.this, path1.toString(), Toast.LENGTH_LONG).show();
File folder = new File(path1.toString());
File files[] = folder.listFiles();
for (int i=0; i < files.length; i++) {
Toast.makeText(MainActivity.this, files[i].getName(), Toast.LENGTH_LONG).show();
}
การบันทึกไฟล์ไว้ใน Project ตั้งแต่ตอนสร้าง App
- ให้ใส่ไฟล์ไว้ที่ res > raw
- แล้วใช้คำสั่ง openRawResource() โดยใส่ค่า
R.raw.<filename>
- ก็จะได้ InputStream สำหรับนำไปใช้
16 พ.ค. 57