File Input/Output – Assets


Bài số 7 của Blog Android cơ bản: http://wp.me/p6SFw

Nội dung đạt được

– Tài liệu cần tham khảo: java.io , File&I/O , Projects overview
– Đọc dữ liệu văn bản từ thư mục Assets
– Mục tiêu: Tự viết được ứng dụng đọc truyện cơ bản, ứng dụng Ghi chú, hiển thị tên người chơi có số điểm cao nhất trong game …

Tips:

1- Xem file *txt trong máy ảo sau khi build ứng dụng:
1
2

– Tìm đến thư mục “data.txt” theo đường dẫn “data–> data–>com.wosea.readfile–>files–>mydata.txt”.
– com.wosea.readfile: là package do lập trình viên đặt.
2- Sử dụng Version Control share source code lên github:
3

và thực hiện theo hướng dẫn.

Stream – Luồng dữ liệu

Stream đóng vai trò đường dẫn, dẫn dữ liệu từ file nguồn đến chương trình để đọc dữ liệu, và từ chương trình đến nguồn dữ liệu để lưu lại.
5

Chia làm 2 loại InputStream (luồng vào), OutputStream (luồng ra)
4

InputStream – OutputStream

– InputStream: Đọc dữ liệu byte hay mảng byte từ nguồn dữ liệu. Nguồn dữ liệu có thể là file, chuỗi, hay bộ nhớ chứa dữ liệu. Là 1 abstract class cho tất cả các lớp input kế thừa từ nó.

– OutputStream: Ghi dữ liệu byte hay mảng byte vào nguồn dữ liệu. Nguồn dữ liệu có thể là file, chuỗi, hay bộ nhớ chứa dữ liệu. Là 1 abstract class cho tất cả các lớp output kế thừa từ nó.

– Một số phương thức thông dụng:
6

FileInputStream – FileOutputStream

– Cho phép đọc-ghi trên 1 tập tin dưới dạng Stream.
– Các đối tượng của lớp này được tạo ra nhờ một chuỗi đường dẫn đến tập tin, đối tượng File hoặc đối tượng File Descriptor làm đối số.

Assets

– Là thư mục dùng lưu trữ dữ liệu, game data
– Là dạng chỉ đọc, không được ghi. Trước khi làm việc cần tạo sẵn dữ liệu chép vào thư mục này để chương trình sử dụng khi cần.

Đọc file từ Assets

Chúng ta sẽ làm ứng dụng đọc truyện cơ bản nhất.
Cần chuẩn bị 1 file karaoke.txt (chưa tên các bài hát) chép vào thư mục Assets (Nếu project chưa có thư mục assets, tạo thư mục assets theo đường dẫn “app/src/main/assets/”).
7

– Tạo Project
– Trong file layout “activity_main.xml” tạo 1 textview để hiển thị văn bản

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" 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="com.wosea.readfile.MainActivity">

    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:id="@+id/tvText" />
</RelativeLayout>

– Khai báo và ánh xạ textview, tạo hàm đọc file.
– Lưu ý trỏ chuột vào “getAssets()” và xuất hiện, chọn như hình để tạo khối try/catch.
8

package com.wosea.readfile;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import java.io.IOException;
import java.io.InputStream;

public class MainActivity extends AppCompatActivity {

    TextView tvMyText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvMyText=(TextView)findViewById(R.id.tvText);
        onRead1();
        //onRead2();
    }

    public void onRead1()
    {
        try {
            InputStream in= getAssets().open("karaoke.txt");
            int size=in.available();
            byte[] buffer=new byte[size];  // cấp cho bộ nhớ đúng bằng kích thước của file,
            in.read(buffer);               //đây là cách nguy hiểm khi đọc file có kích thước 1gb trở lên
            String mystring=new String(buffer);
            tvMyText.setText(mystring);
            in.close();

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

    public void onRead2()  // Khuyên dùng
    {
        try {
            InputStream in= getAssets().open("karaoke.txt");
            byte[] buffer=new byte[10];
            int len=0;
            while((len=in.read(buffer))>0)
            {
                String mystring=new String(buffer);
                tvMyText.append(mystring);
            }
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Kết quả:
9

Đã hiển thị thành công, từ ví dụ Load dữ liệu từ file này, bạn có thể nâng cấp ứng dụng lên 1 tí, có nút Xóa, Ghi dữ liệu ra file khác, …

  • Lệnh cho nút Xóa
tvMyText.setText("");
  • Lệnh cho nút Ghi dữ liệu
public void onWrite()
{
    try {
        FileOutputStream out=openFileOutput("mydata.txt",MODE_PRIVATE); //xem Tips 1 để biết vị trí file mydata.txt
        String mystring=tvMyText.getText().toString();
        out.write(mystring.getBytes());
        out.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

} 

Chúng ta kết thúc ở đây, bạn hãy tìm hiểu thêm và tạo cho mình ứng dụng có sử dụng kiến thức này nhé, có thắc mắc hãy comment ở cuối trang.
Bài tiếp theo chúng ta sẽ tìm hiểu về DataStorage.


Cảm ơn bạn đã theo dõi blog.
Nhiều ngày tốt lành!

Advertisements

Cho mình biết cảm nhận của bạn nhé

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s