Bài 27: Xử lý tập tin trong Android

Leave a Comment

Bạn xem cấu trúc XML của giao diện (activity_main.xml):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/LinearLayout1"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context=".MainActivity" >
<Button
 android:id="@+id/btnreaddata"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="Read Data" />
<EditText
 android:id="@+id/editdata"
 android:layout_width="match_parent"
 android:layout_height="0dip"
 android:layout_weight="2"
 android:ems="10"
 android:gravity="top|left"
 android:inputType="textMultiLine" >
 
<requestFocus />
 </EditText>
Đây là source code để đọc Resource File:
- Bạn chỉ cần copy đoạn code này vào sự kiện của nút đọc là xong:
public void readData()
 {
 String data;
 InputStream in= getResources().openRawResource(R.drawable.myfile);
 InputStreamReader inreader=new InputStreamReader(in);
 BufferedReader bufreader=new BufferedReader(inreader);
 StringBuilder builder=new StringBuilder();
 if(in!=null)
 {
 try
{
 while((data=bufreader.readLine())!=null)
 {
 builder.append(data);
 builder.append("\n");
 }
 in.close();
 editdata.setText(builder.toString());
}
 catch(IOException ex){
 Log.e("ERROR", ex.getMessage());
 }
}
}
Ở đây Tôi không cung cấp source nguồn, vì nó chỉ có 1 hàm xí xi đó. Các bạn chỉ cần thiết kế giao diện cho giống như XML Layout rồi copy code vào sự kiện của nút nhấn là xong.
- Cách đọc tập tin trong Android y chang như trong Java thuần túy, ở đây bạn chỉ để ý dòng lệnh số 4:
InputStream in= getResources().openRawResource(R.drawable.myfile);
Dòng lệnh này để đọc Resource File và trả về InputStream. Khi có InputStream rồi thì mọi xử lý sẽ giống như Java.
* Đọc và ghi tập tin:
- Trường hợp này bạn kéo thả tập tin vào cấu trúc thư mục như hình bên dưới (dùng DDMS):
- Nhìn vào những vệt Tôi tô màu vàng, các bạn kéo thả vào đúng vị trí ứng dụng của bạn.
28_file_1
- XML Resource cho bài tập này:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/LinearLayout1"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context=".MainActivity" >
 
<Button
 android:id="@+id/btnreaddata"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="Read Data" />
 
<EditText
 android:id="@+id/editdata"
 android:layout_width="match_parent"
 android:layout_height="0dip"
 android:layout_weight="2"
 android:ems="10"
 android:gravity="top|left"
 android:inputType="textMultiLine" >
 
<requestFocus />
 </EditText>
 
<Button
 android:id="@+id/btnwritedata"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="Write Data" />
 
</LinearLayout>
- XML resource trên sẽ tạo giao diện như hình bên dưới:
28_file_2
- Source Activity
package tranduythanh.com;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
 
public class MainActivity extends Activity implements OnClickListener{
 
Button btnread,btnwrite;
 EditText editdata;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 btnread=(Button) findViewById(R.id.btnreaddata);
 btnwrite=(Button) findViewById(R.id.btnwritedata);
 editdata=(EditText) findViewById(R.id.editdata);
 btnread.setOnClickListener(this);
 btnwrite.setOnClickListener(this);
 }
 public void onClick(View v) {
 if(v.getId()==R.id.btnreaddata)
 {
 readData();
 }
 else if(v.getId()==R.id.btnwritedata)
 {
 writeData();
 }
 }
 /**
 * Hàm đọc tập tin trong Android
 * Dùng openFileInput trong Android để đọc
 * ra FileInputStream
 */
 public void readData()
 {
 try {
 FileInputStream in= openFileInput("myfile.txt");
 BufferedReader reader=new
 BufferedReader(new InputStreamReader(in));
 String data="";
 StringBuilder builder=new StringBuilder();
 while((data=reader.readLine())!=null)
 {
 builder.append(data);
 builder.append("\n");
 }
 in.close();
 editdata.setText(builder.toString());
 } catch (FileNotFoundException e) {
 e.printStackTrace();
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
 /**
 * Hàm ghi tập tin trong Android
 * dùng openFileOutput để ghi
 * openFileOutput tạo ra FileOutputStream
 */
 public void writeData()
 {
 try {
 FileOutputStream out=
 openFileOutput("myfile.txt",0);
 OutputStreamWriter writer=
 new OutputStreamWriter(out);
 writer.write(editdata.getText().toString());
 writer.close();
 } catch (FileNotFoundException e) {
 e.printStackTrace();
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
 /*
 * hàm này là đọc Resource File, Tôi gom chung vào đây
 */
 public void readData2()
 {
 String data;
 InputStream in= getResources()
 .openRawResource(R.drawable.myfile);
 InputStreamReader inreader=new InputStreamReader(in);
 BufferedReader bufreader=new BufferedReader(inreader);
 StringBuilder builder=new StringBuilder();
 if(in!=null)
 {
 try{
 while((data=bufreader.readLine())!=null)
 {
 builder.append(data);
 builder.append("\n");
 }
 in.close();
 editdata.setText(builder.toString());
 }
 catch(IOException ex){
 Log.e("ERROR", ex.getMessage());
 }
 }
 }
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
 // Inflate the menu; this adds items to the action bar if it is present.
 getMenuInflater().inflate(R.menu.activity_main, menu);
 return true;
 }
}
- Bạn nhìn vào dòng lệnh 52: FileInputStream in= openFileInput(“myfile.txt”);
Lệnh ở dòng này mở tập tin lên để đọc, nó trả về FileInputStream nên mọi thứ sẽ giống như Java thuần túy.
- Tiếp tục nhìn vào dòng lệnh 78: FileOutputStream out=openFileOutput(“myfile.txt”,0);
Lệnh ở dòng này mở tập tin lên để ghi. đối số thứ 2 Tôi để là số 0 (MODE_PRIVATE) là mặc định. Bạn có thể dùng MODE_APPENDMODE_WORLD_READABLE,MODE_WORLD_WRITEABLE. Ý nghĩa của mỗi mode bạn có thể lên mạng tìm. Hoặc chỉ cần di chuyển chuột vào hàm trên là eclipse tự giải thích cho các bạn (nếu eclipse bạn đã cài Javadoc).
- Bạn tải source code mẫu phần này ở đây:
2. External Storage:
- Để vừa ghi vừa đọc trên SD Card thì ta phải sử dụng 2 permission bên dưới trongAndroidManifest:
<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE” />
<uses-permission android:name=”android.permission.READ_EXTERNAL_STORAGE” />
- Để lấy được đường dẫn của SD Card ta dùng lệnh:
String sdcard=Environment.getExternalStorageDirectory().getAbsolutePath();
- Sau đó mọi thứ tương tác với tập tin thì y xì như Java thuần túy, ở đây Tôi dùng Scanner để đọc và OutputStreamWriter để ghi.
- Vì vậy giao diện Tôi làm y chang như Internal Storage:
- Bạn tạo Project và kéo thả tập tin vào SD card (dĩ nhiên khi tạo AVD thì bạn phải checked vào using SD card thì mới có). Bạn xem hình để biết cách kéo thả vào SD Card:
Ở hình trên bạn vào DDMS, tới thư mục mnt/ chọn sdcard. Phải chọn cho đúng vì nó có nhiều thư mục cùng tên sdcard, nhưng bạn chọn sdcard ở trong thư mục mnt thôi. Sau đó kéo thả tập tin vào đây là xong.
- XML Resource y xì như phần internal Storage nên Tôi không đưa vào đây, bạn xem Source code Activity:
package tranduythanh.com;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Scanner;
 
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
 
public class MainActivity extends Activity implements OnClickListener{
 
Button btnread,btnwrite;
 EditText editdata;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 btnread=(Button) findViewById(R.id.btnreaddata);
 btnwrite=(Button) findViewById(R.id.btnwritedata);
 editdata=(EditText) findViewById(R.id.editdata);
 btnread.setOnClickListener(this);
 btnwrite.setOnClickListener(this);
 }
 public void onClick(View v) {
 if(v.getId()==R.id.btnreaddata)
 {
 readData();
 }
 else if(v.getId()==R.id.btnwritedata)
 {
 writeData();
 }
 }
 /*
 * đọc từ SD Card
 * Environment.getExternalStorageDirectory().getAbsolutePath()
 * để lấy đường dẫn trên SD Card
 */
 public void readData()
 {
 String sdcard=Environment
 .getExternalStorageDirectory()
 .getAbsolutePath()+"/myfile.txt";
 try {
 Scanner scan=new Scanner(new File(sdcard));
 String data="";
 while(scan.hasNext())
 {
 data+=scan.nextLine()+"\n";
 }
 scan.close();
 editdata.setText(data+"");
 } catch (FileNotFoundException e) {
 e.printStackTrace();
 }
 }
 /**
 * ghi tập tin trên SD Card
 */
 public void writeData()
 {
 String sdcard=Environment
 .getExternalStorageDirectory()
 .getAbsolutePath()+"/myfile.txt";
 try {
 OutputStreamWriter writer=
 new OutputStreamWriter(
 new FileOutputStream(sdcard));
 writer.write(editdata.getText()+"");
 writer.close();
 } catch (FileNotFoundException e) {
 e.printStackTrace();
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
 // Inflate the menu; this adds items to the action bar if it is present.
 getMenuInflater().inflate(R.menu.activity_main, menu);
 return true;
 }
 
}
Vì có sử dụng Permission nên bạn xem AndroidManifest:
<?xml version="1.0" encoding="utf-8"?>
 package="tranduythanh.com"
 android:versionCode="1"
 android:versionName="1.0" >
 
<uses-sdk
 android:minSdkVersion="14"
 android:targetSdkVersion="17" />
 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 
<application
 android:allowBackup="true"
 android:icon="@drawable/ic_launcher"
 android:label="@string/app_name"
 android:theme="@style/AppTheme" >
 <activity
 android:name="tranduythanh.com.MainActivity"
 android:label="@string/app_name" >
 <intent-filter>
 <action android:name="android.intent.action.MAIN" />
 
<category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>
 </activity>
 </application>
 
</manifest>
Khi thực thi ứng dụng, bạn sẽ có giao diện như trình bày ở trên, với kết quả như mong muốn.
- Bạn có thể tải coding mẫu ở đây:



0 nhận xét:

Đăng nhận xét