ดาวโหลด บทความ สถิติผู้ใช้ เกี่ยวกับเรา ติดต่อเรา
HomeAndroid

การอ่านเขียนไฟล์

มือถือทุกเครื่องจะมีพื้นที่เก็บข้อมูลอยู่ในตัว เรียกว่า "เมมภายใน"
และบางเครื่องใส่ 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
© 2000 - 2024 palthai.com. All rights reserved.