Android - Đọc ghi file ở bộ nhớ trong

Code: Default | Auth: 03cd82

1) Phân biệt bộ nhớ trong và bộ nhớ ngoài

Bộ nhớ trong (internal storage) là bộ nhớ sẵn có trong điện thoại, bộ nhớ ngoài (external storage) là phần gắn thêm vào điện thoại như thẻ nhớ, usb...

Khi đọc và ghi file ở bộ nhớ trong thì không cần xin quyền người dùng. Đối với bộ nhớ ngoài thì bạn phải xin quyền người dùng bằng cách khai báo sử dụng quyền ở AndroidMainifest.xml

Tốc độ truy cập dữ liệu ở bộ nhớ trong sẽ nhanh hơn bộ nhớ ngoài.

Khi gỡ bỏ ứng dụng thì các file ghi ở bộ nhớ trong sẽ bị xóa hết. Ngược lại các file ghi ở bộ nhớ ngoài sẽ không bị xóa.

Đọc ghi file dữ liệu thì thường sử dụng lớp FileInputStream and FileOutputStream để thực hiện.

2) Tạo ứng dụng ví dụ đọc ghi file text ở bộ nhớ trong.

Bước 1: Bạn hãy tạo 1 ứng dụng mới để làm ví dụ tránh rắc rối

Bước 2: Trong file layout bạn nên chọn dạng LinearLayout, nếu dạng khác thì tùy bạn sắp xếp. Bên trong này có 1 EditText và 2 Button nhé

<Edittext
 android:hint="Nội dung bất kỳ"
 android:id="@+id/ed_content"
 android:layout_height="wrap_content" 
android:layout_width="match_parent"/>

<Button android:id="@+id/btn_save" 
android:layout_height="wrap_content" 
android:layout_width="wrap_content" 
android:onClick="SaveFile" 
android:text="Save to file"/>
 

<Button android:id="@+id/btn_read" 
android:layout_height="wrap_content" 
android:layout_width="wrap_content" 
android:onClick="ReadFile" 
android:text="Read from file"/>

Hai Button ở trên có 2 sự kiện onClick là SaveFile() và ReadFile(). Bạn hãy mở file java MainActivity để khai báo 2 cái tên hàm này trước nhé.

Bước 3: Khai báo 2 hàm SaveFile() và ReadFile()

public void SaveFile(View view){

}

public void ReadFile(View view){

}

Bước 4: Khai báo thuộc tính để tham chiếu tới EditText

public class MainActivity extends AppCompatActivity {
    EditText ed_content;  // thuộc tính này để tham chiếu tới EditText
...

Bước 5: Trong hàm onCreate() bạn gắn view cho biến ed_content

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ed_content = findViewById(R.id.ed_content);  // bạn chỉ viết dòng này thôi nhé, không viết lại hàm

    }

Bước 6: Làm việc với hàm SaveFile()

Đây là hàm xử lý sự kiện bấm nút lưu file. Bạn hãy xem giải thích trong code dưới nhé. 

    public void SaveFile(View view){
        String noidung = ed_content.getText().toString(); // lấy nội dung người dùng vừa nhập
        String file_name = "vidu.txt";  // khai báo tên file sẽ lưu

        try {
            // mở luồng tạo file
            FileOutputStream fileOutputStream = openFileOutput(file_name, Context.MODE_PRIVATE);

            // ghi dữ liệu vào file, chuyển chuỗi nội dung thành mảng các byte dữ liệu và ghi file
            fileOutputStream.write(noidung.getBytes()); 

            // đóng luồng
            fileOutputStream.close();

            // nếu không có lỗi thì thông báo kết quả
            Toast.makeText(getBaseContext(),"Đã ghi vào file", Toast.LENGTH_SHORT).show();

        } catch (FileNotFoundException e) {
            // lỗi này là không đúng đường dẫn file
            e.printStackTrace();
        } catch (IOException e) {
           // lỗi này là lỗi không thể ghi dữ liệu vào file hoặc không mở được file do tiến trình khác đang mở file này.
            e.printStackTrace();
        }
    }

Bước 7: Chạy thử chương trình, nhập sữ liệu bất kỳ và bấm nút "Save to file"

Bước 8: Mở cửa sổ Device File Explorer ra để xem kết quả có file hay chưa

Ghi file vào bộ nhớ trong

OK như vậy là việc ghi file đã thành công!

3) Đọc nội dung file text vừa ghi lên biến

Bước 1: Bạn viết thêm code cho hàm ReadFIle()

public void ReadFile(View view){
        String file_name = "vidu.txt";  // chú ý phải đúng tên file bạn đã ghi nhé.
        //tạo đối tượng string buff để xây dựng chuỗi dữ liệu
        StringBuffer stringBuffer = new StringBuffer(); 

        try {

            // luồng dữ liệu file
            FileInputStream fileInputStream = openFileInput(file_name);
            // khai báo luồng đọc dữ liệu
            InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
            // tạo biến đệm cho quá trình đọc
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

            String line;
            // Dùng vòng lặp để đọc từ dòng đầu tiên đến hết file
            while ( ( line = bufferedReader.readLine() ) != null     ){  
                // nếu kết quả đọc 1 dòng cho vào biến line mà khác null (nghĩa là biến line nhận giá trị khác null) thì append vào chuỗi buffer
                stringBuffer.append(line); // nối vào chuỗi buffer
            }
            
            // kết thúc vòng lặp thì hoàn thành đọc file. Khi nào đọc hết file thì line sẽ là null
            // thông báo ra màn hình thôi
            Toast.makeText(getBaseContext(), stringBuffer.toString(),Toast.LENGTH_SHORT).show();


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

Bước 2: Chạy thử chương trình và bấm nút "Read from file" và xem kết quả nhé.