Lập trình Android - Lưu tập tin ở bộ nhớ trong

Lưu tập tin ở bộ nhớ trong

Để đơn giản hóa việc đọc và ghi luồng dữ liệu tập tin được lưu ở bộ nhớ trong (hay gọi là thư mục dữ liệu bên trong ứng dụng trong hê thống) Android cung cấp các phương thức openFileInput / openFileOutput tương ứng cho 2 luồng đọc và ghi từ context của phiên làm việc hiện tại của ứng dụng. Nếu tập tin có tên là giá trị được truyền làm đối số của hàm FileOutputStream() không tồn tại (tập tin chưa được tạo ra và lưu lại), hệ thống sẽ tự động tạo tập tin và ghi xuống bộ nhớ. Nếu đã có sẵn thì hệ thống mặc định sẽ chép đè nội dung mới lên nội dung cũ của tập tin. Trừ trường hợp nếu mode được gán là Context.MODE_APPEND thì nội dung mới sẽ được thêm vào nối tiếp nội dung sẵn có trong tập tin.

 


Một số điểm quan trọng trong việc lưu trữ trong bộ nhớ trong

  • Dữ liệu trong bộ nhớ được phép đọc và ghi vào tập tin.
  • Các tập tin này chỉ được truy cập bởi chính ứng dụng đó, không cho phép truy cập bởi ứng dụng khác.
  • Các tập tin này vẫn tồn tại khi ứng dụng vẫn tồn tại, các tập tin sẽ bị xóa tự động khi ứng dụng uninstall.
  • Các tập tin này lưu trữ trong thư mục data/data theo sau là tên package của ứng dụng.
  • Có thể phân quyền cho các ứng dụng khác truy cập các tập tin này.
  • Để phân quyền dữ liệu chúng ta có thể dùng chế đô MODE_PRIVATE

Các Mode lưu trữ ở bộ nhớ trong

MODE_PRIVATE – Đây là chế độ mặc định. MODE_PRIVATE được sử dụng để thiết lập chế độ riêng tư, không chấp nhận ứng dụng từ bên ngoài.

MODE_APPEND – Dữ liệu được thêm vào tập tin đã tồn tại
 


Ghi dữ liệu vào tập tin

  • Định nghĩa tên tập tin và cũng định nghĩa dữ liệu bạn muốn ghi vào tập tin.
  • Sử dụng phương thức FileOutputStream .
  • Đổi dữ liệu thành byte stream.
String File_Name= "Demo.txt"; //gives file name
String Data="Hello!!"; //define data

FileOutputStream fileobj = openFileOutput( File_Name, Context.MODE_PRIVATE);
byte[] ByteArray = Data.getBytes(); //Converts into bytes stream
fileobj.write(ByteArray); //writing to file
fileobj.close(); //File closed

Ví dụ: Trong ví dụ này chúng ta sẽ làm ứng dụng để lưu trữ dữ liệu trong bộ nhớ trong. Trong ứng dụng có 2 Activity, Activity đầu tiên lưu trữ dữ liệu, Activity 2 dùng để đọc dữ liệu. Tiến hành tạo project, vào thư mục  res /layout -> activity_main.xml  thiết kế giao diện sau:

Bước 1: Tạo một project tên là InternalStorageFile->New->Android Application Project điền các thông tin ->Next ->Finish
Bước 2: 
Mở res -> layout -> xml (hoặc) activity_main.xml và thêm code trong Relaytive Layout
Trong code chúng ta thêm textviewedittext và button có sự kiện onclick.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="hiepsiit.com.internalstorage.Main2Activity" >

 
    <TextView
        android:text="name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignRight="@+id/button3"
        android:layout_alignEnd="@+id/button3"
        android:layout_marginRight="11dp"
        android:layout_marginEnd="11dp"
        android:layout_marginTop="76dp"
        android:id="@+id/textView3"
        android:textSize="18sp"
        android:textStyle="bold|italic" />

    <TextView
        android:text="password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView3"
        android:layout_alignRight="@+id/textView3"
        android:layout_alignEnd="@+id/textView3"
        android:layout_marginTop="33dp"
        android:id="@+id/textView4"
        android:textStyle="bold|italic"
        android:textSize="18sp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/textView4"
        android:layout_alignLeft="@+id/button4"
        android:layout_alignStart="@+id/button4"
        android:id="@+id/getname"
        android:textStyle="bold|italic"
        android:textSize="18sp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/textView4"
        android:layout_alignLeft="@+id/getname"
        android:layout_alignStart="@+id/getname"
        android:id="@+id/getpass"
        android:textStyle="bold|italic"
        android:textSize="18sp" />

    <Button
        android:text="@string/load"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button3"
        android:layout_marginLeft="35dp"
        android:layout_marginStart="35dp"
        android:onClick="loadMe"
        android:layout_below="@+id/textView4"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="80dp" />

    <Button
        android:text="@string/back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="54dp"
        android:layout_marginEnd="54dp"
        android:id="@+id/button4"
        android:onClick="backMe"
        android:layout_alignBaseline="@+id/button3"
        android:layout_alignBottom="@+id/button3"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />


</RelativeLayout>

Bước 3: Trong tập tin strings.xml chúng ta định nghĩa các nhãn cho  textviewedittext và button.

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">" InternalStorage"</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="name">NAME</string>
    <string name="password">PASSWORD</string>
    <string name="save">SAVE</string>
    <string name="next">NEXT</string>
    <string name="load">LOAD</string>
    <string name="back">BACK</string>
    <string name="title_activity_main2">Main2Activity</string>

</resources>

Bước 4: Mở app -> src ->MainActivity.java và thêm code. Trong bước này chúng ta mở MainActivity.java và thêm các phương thức cho 2 button "SAVE" và "NEXT". Button "SAVE " lấy dữ liệu từ edittext và lưu nó vào tập tin theo định dạng là byte. Chúng ta cũng hiển thị đường dẫn tập tin thông qua đối tượng Toast. Phương thức cho button "NEXT" mở Activity 2 .

package hiepsiit.com.internalstorage;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
	EditText editname,editpass;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		editname = (EditText) findViewById(R.id.editName);
        editpass= (EditText) findViewById(R.id.editPass);
	}
public void  saveMe(View view)  // SAVE
    {
        File file= null;
        String name = editname.getText().toString();
        String password = editpass.getText().toString();

            FileOutputStream fileOutputStream = null;
            try {
                name = name + " ";
                file = getFilesDir();
                fileOutputStream = openFileOutput("Code.txt", Context.MODE_PRIVATE); //MODE PRIVATE
                fileOutputStream.write(name.getBytes());
                fileOutputStream.write(password.getBytes());
                Toast.makeText(this, "Saved \n" + "Path --" + file + "\tCode.txt", Toast.LENGTH_SHORT).show();
                editname.setText("");
                editpass.setText("");
                return;
            } catch (Exception ex) {
                ex.printStackTrace();
            } finally {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    public void  nextMe(View view)   //NEXT
    {
        Toast.makeText(this,"NEXT", Toast.LENGTH_SHORT).show();
        Intent intent= new Intent(this, Main2Activity.class);
        startActivity(intent);

    }
}

Bước 5: Tạo thêm Activity Android đặt tên Main2Activity .  Mở res -> layout -> xml (hoặc) activity_main2.xml và thêm code:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="hiepsiit.com.internalstorage.Main2Activity" >

 
    <TextView
        android:text="name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignRight="@+id/button3"
        android:layout_alignEnd="@+id/button3"
        android:layout_marginRight="11dp"
        android:layout_marginEnd="11dp"
        android:layout_marginTop="76dp"
        android:id="@+id/textView3"
        android:textSize="18sp"
        android:textStyle="bold|italic" />

    <TextView
        android:text="password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView3"
        android:layout_alignRight="@+id/textView3"
        android:layout_alignEnd="@+id/textView3"
        android:layout_marginTop="33dp"
        android:id="@+id/textView4"
        android:textStyle="bold|italic"
        android:textSize="18sp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/textView4"
        android:layout_alignLeft="@+id/button4"
        android:layout_alignStart="@+id/button4"
        android:id="@+id/getname"
        android:textStyle="bold|italic"
        android:textSize="18sp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/textView4"
        android:layout_alignLeft="@+id/getname"
        android:layout_alignStart="@+id/getname"
        android:id="@+id/getpass"
        android:textStyle="bold|italic"
        android:textSize="18sp" />

    <Button
        android:text="@string/load"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button3"
        android:layout_marginLeft="35dp"
        android:layout_marginStart="35dp"
        android:onClick="loadMe"
        android:layout_below="@+id/textView4"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="80dp" />

    <Button
        android:text="@string/back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="54dp"
        android:layout_marginEnd="54dp"
        android:id="@+id/button4"
        android:onClick="backMe"
        android:layout_alignBaseline="@+id/button3"
        android:layout_alignBottom="@+id/button3"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />


</RelativeLayout>

Bước 6: Mở src -> package -> Main2Activity.java. Trong bước này chúng ta mở Main2Activity.java và thêm các phương thức cho 2 button "Load" và "Back". Button "Load" lấy dữ liệu từ tập tin và lưu nó vào đối tượng StringBuffer, sau đó hiển thị nó lên textview. Phương thức cho button "Back" mở MainActivity.

package hiepsiit.com.internalstorage;

import java.io.FileInputStream;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class Main2Activity extends Activity {
	TextView getname, getpass;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main2);
		getname = (TextView)findViewById(R.id.getname);
	    getpass = (TextView)findViewById(R.id.getpass);
	}
	
	public void  loadMe(View view)
    {
        try {
           FileInputStream fileInputStream =  openFileInput("Code.txt");
            int read = -1;
            StringBuffer buffer = new StringBuffer();
           while((read =fileInputStream.read())!= -1){
               buffer.append((char)read);
           }
            Log.d("Code", buffer.toString());
            String name = buffer.substring(0,buffer.indexOf(" "));
            String pass = buffer.substring(buffer.indexOf(" ")+1);
            getname.setText(name);
            getpass.setText(pass);
        } catch (Exception e) {
            e.printStackTrace();
        }
        Toast.makeText(this,"Loaded", Toast.LENGTH_SHORT).show();
    }

    public void  backMe( View view)
    {
        Toast.makeText(this,"Back", Toast.LENGTH_SHORT).show();
        Intent intent= new Intent(this, MainActivity.class);
        startActivity(intent);
    }
}

Download ví dụ

Ứng dụng này được phát triển bởi adt bundleandroid 4.2 sử dụng minimum sdk 8 and target sdk 21.


Kết quả khi chạy ứng dụng:


Xem tập tin được lưu trữ trong Shared Preference:

Chọn Window-> Show View -> Other

Sau đó, tìm File Explore ->OK

Chọn File Explore