Sunday 31 August 2014

Đọc ghi file bộ nhớ ngoài-Storage External

Ở bài hướng dẫn lần trước mình đã giới thiệu cho các bạn về đọc ghi file trong trực tiếp lên bộ nhớ trong ứng dụng. Ở trong phần này mình sẽ hướng dẫn các bạn đọc ghi file ở bộ nhớ ngoài. Nếu bạn nào chưa đọc hoặc không nhớ bạn có thể xem lại bài viết trước đó ở đây.

Về cơ bản việc đọc ghi file bên ngoài không có khác so với việc đọc ghi file ở bên trong bộ nhớ, chỉ có điều chúng ta cần phải kiểm tra xem liệu bộ nhớ ngoài sdCard có tồn tại hay không, nếu có chúng ta mới có thể thực hiện việc đọc ghi dữ liệu. Vậy tại sao phải đọc ghi dữ liệu bên ngoài, điều này vô cùng quan trọng nếu không đọc ghi dữ liệu bên ngoài thì với một file lớn các bạn lưu trữ bên trong, nếu bộ nhớ của máy lớn thì không có vấn đề gì, nhưng bộ nhớ máy hạn chế là một việc khác, khi đó nó sẽ chiếm hết không gian cho việc cài những ứng dụng tiếp theo của người dùng. Hãy cân nhắc phương án khi bạn sử dụng.

Quay trở lại các bạn hãy mở Project hôm trước ReadWriteFile ra và mở file MainActivity.java chúng ta cần thêm vào 2 phương thức sau


private void saveFileExternal() {
// TODO Auto-generated method stub
OutputStreamWriter writer = null;
// Get sdCard path
File sdCard = Environment.getExternalStorageDirectory();
if (sdCard.exists()) {// Check Sdcard exists
File directory = new File(sdCard.getAbsolutePath() + "/MyFiles");
if (!directory.exists()) {
directory.mkdirs();
}
File file = new File(directory, "test_file.txt");
try {
writer = new OutputStreamWriter(new FileOutputStream(file));
writer.write(editText.getText().toString());
writer.flush();
this.editText.setText("");
Toast.makeText(this, "Save file sucess", Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
// TODO: handle exception
}
}
}

} else {
System.err.println("Storage sdCard not exists");
}
}

private void loadFileExternal() {
// TODO Auto-generated method stub
BufferedReader reader = null;
File directory = new File(Environment.getExternalStorageDirectory()
+ "/MyFiles");
if (directory.exists()) {
File file = new File(directory, "test_file.txt");
if (file.exists()) {
try {
reader = new BufferedReader(new InputStreamReader(
new FileInputStream(file)));
String temp = "";
StringBuilder data = new StringBuilder();
while ((temp = reader.readLine()) != null) {
data.append(temp);
}
this.editText.setText(data.toString());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
// TODO: handle exception
}
}
}
} else {
System.err.println("File not exists");
}
} else {
System.err.println("Directory not exists");
}
}

Có một điều rất quan trọng khi đọc ghi file bộ nhớ ngoài các bạn cần cung cấp quyền cho ứng dụng, hãy mở file AndroidManifest.xml chúng ta cần phải thêm quyền sau ngay phía dưới thẻ uses-sdk

<uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="21" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Ở đoạn code Java trên các bạn chủ yếu chú ý tới dòng code được đánh dấu sau

File sdCard = Environment.getExternalStorageDirectory();
if (sdCard.exists()) {// Check Sdcard exists
File directory = new File(sdCard.getAbsolutePath() + "/MyFiles");
if (!directory.exists()) {
directory.mkdirs();
}

Ở đây mình sẽ thử get đường dẫn tới bộ nhớ ngoài bằng lệnh getExternalStorageDirectory rồi sau đó kiểm tra liệu nó còn tồn tại hay không, nếu có chúng ta tiếp tục tạo một folder có tên là MyFiles rồi tiếp tục kiểm tra nó tồn tại hay không, nếu chưa tồn tại chúng ta sẽ tạo thư mục đó bằng phương thức mkdirs(). Tiếp đó việc đọc ghi file vẫn bình thường như chúng ta thường làm. 

Note: Mọi thư mục hay tệp tin trong máy tính được đều coi là đối tượng file.

Tiếp đó ở phương thức loadFileExternal đơn giản chúng ta sẽ đọc file đó theo đường dẫn chúng ta vừa tạo ra, đầu tiên là đi tới thư mục 
File directory = new File(Environment.getExternalStorageDirectory()
+ "/MyFiles");
và tiếp tục kiểm tra file bên trong nó có tồn tại hay không.

Để chạy thử các bạn hãy comment việc gọi 2 phương thức là saveFile và loadFile của bài hôm trước lại và chúng ta thay vào lần lượt các phương thức trong sự kiện click của các button tương ứng

this.btnSave.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//saveFile();
saveFileExternal();
}
});

this.btnLoad.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//loadFile();
loadFileExternal();
}

});

Kết quả khi chạy chương trình chúng ta sẽ được




Để kiểm tra kết quả ghi file trông ra sao, các bạn có thể bật DDMS mà eclipse hộ trợ chúng ta để xem kết quả. Ở đây mình dùng máy ảo Genymontion



Như các bạn thấy một file tên test_file.txt đã được tạo ra.

Vậy là mình đã giới thiệu xong cho các bạn phần đọc ghi file ở bộ nhớ ngoài, hy vọng các bạn có thể nắm được cách mà chúng ta đọc ghi bộ nhớ. Ngoài ra để có thể kiểm tra việc ghi file kỹ càng hơn các bạn có thể kiểm tra tính khả dụng của bộ nhớ trước khi ghi như xem nó còn đủ bộ nhớ hay không, có thể ghi hay không, ở trong bài viết này mình sẽ không đề cập các bạn có thể tham khảo trong bài viết hướng dẫn này của Android dev nó sẽ có hướng dẫn cho các bạn chỉ việc copy + paste về và edit mà thôi :D
http://developer.android.com/reference/android/os/Environment.html#getExternalStorageDirectory()

Vậy là bài viết của mình tới đây là kết thúc, nếu hay hãy chia sẽ nó cho người khác nhé.


1 comment :