Trong lập trình android, nhiều khi chúng ta cần thao tác với các dữ liệu trong bộ nhớ của thiết bị android, hoặc tạo các dữ liệu trong bộ nhớ này. Bộ nhớ trong android được chia làm hai loại là bộ nhớ trong (Internal storage) và bộ nhớ ngoài (External storage)
Trong bài học này chúng ta sẽ tìm hểu về bộ nhớ trong của android (Internal storage) và làm một ví dụ đơn giản về lưu trữ dữ liệu và đọc dữ liệu lên tại bộ nhớ trong của thiết bị andorid.
Android Internal storage là nơi lưu trữ dữ liệu cá nhân của từng ứng dụng, các dữ liệu được tạo ra và lưu trữ này sẽ được sự dụng riêng cho từng ứng dụng đó và các ứng dụng khác sẽ không thể truy cập vào được. Khi ứng dụng đó được gỡ bỏ khỏi thiết bị android thì các file dữ liệu được lưu tại bộ nhớ trong này sẽ bị xóa bỏ theo. Khi chúng ta làm việc với các file dữ liệu ở bộ nhớ trong thì chỉ có thể làm việc với tên file đơn giản mà không thể làm việc với tên file có đường dẫn.
Bây giờ chúng ta sẽ làm một ví dụ đơn giản để lưu một chuỗi văn bản vào bộ nhớ trong một file txt và sau đó đọc file txt đó rồi đưa ra ngoài màn hình.
Đầu tiên ta tạo một project mới với MainActivity dạng EmptyActivity. Ở đây mình tạo project có tên Internal_Storage
Tại giao diện của MainActivity ta tạo tại file activity_main.xml bao mồm một TextView để thông báo trạng thái lưu hoặc đọc dữ liệu, một EditText để nhập vào dữ liệu, 2 Button để nhấn lưu dữ liệu và đọc ra dữ liệu từ bộ nhớ trong:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
<span class="php"><span class="hljs-meta"><?</span>xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"utf-8"</span><span class="hljs-meta">?></span></span> <span class="hljs-tag"><<span class="hljs-name">LinearLayout</span> <span class="hljs-attr">xmlns:android</span>=<span class="hljs-string">"http://schemas.android.com/apk/res/android"</span> <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span> <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"match_parent"</span> <span class="hljs-attr">android:gravity</span>=<span class="hljs-string">"center"</span> <span class="hljs-attr">android:orientation</span>=<span class="hljs-string">"vertical"</span>></span> <span class="hljs-tag"><<span class="hljs-name">TextView</span> <span class="hljs-attr">android:textSize</span>=<span class="hljs-string">"25sp"</span> <span class="hljs-attr">android:gravity</span>=<span class="hljs-string">"center"</span> <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"fill_parent"</span> <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span> <span class="hljs-attr">android:text</span>=<span class="hljs-string">"Lưu trữ file vào bộ nhớ trong"</span> /></span> <span class="hljs-tag"><<span class="hljs-name">EditText</span> <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/myInputText"</span> <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span> <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span> <span class="hljs-attr">android:ems</span>=<span class="hljs-string">"10"</span> <span class="hljs-attr">android:gravity</span>=<span class="hljs-string">"top|left"</span> <span class="hljs-attr">android:inputType</span>=<span class="hljs-string">"textMultiLine"</span> <span class="hljs-attr">android:lines</span>=<span class="hljs-string">"5"</span> <span class="hljs-attr">android:minLines</span>=<span class="hljs-string">"3"</span>></span> <span class="hljs-tag"><<span class="hljs-name">requestFocus</span> /></span> <span class="hljs-tag"></<span class="hljs-name">EditText</span>></span> <span class="hljs-tag"><<span class="hljs-name">LinearLayout</span> <span class="hljs-attr">android:orientation</span>=<span class="hljs-string">"horizontal"</span> <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span> <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>></span> <span class="hljs-tag"><<span class="hljs-name">Button</span> <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span> <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/btnSave"</span> <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"0dp"</span> <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span> <span class="hljs-attr">android:text</span>=<span class="hljs-string">"Lưu vào"</span> /></span> <span class="hljs-tag"><<span class="hljs-name">Button</span> <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span> <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/btnDisplay"</span> <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"0dp"</span> <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span> <span class="hljs-attr">android:text</span>=<span class="hljs-string">"Lấy dữ liệu "</span> /></span> <span class="hljs-tag"></<span class="hljs-name">LinearLayout</span>></span> <span class="hljs-tag"><<span class="hljs-name">TextView</span> <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/responseText"</span> <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"wrap_content"</span> <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span> <span class="hljs-attr">android:padding</span>=<span class="hljs-string">"5dp"</span> <span class="hljs-attr">android:text</span>=<span class="hljs-string">""</span> <span class="hljs-attr">android:textAppearance</span>=<span class="hljs-string">"?android:attr/textAppearanceMedium"</span> /></span> <span class="hljs-tag"></<span class="hljs-name">LinearLayout</span>></span> |
Khi đã tạo xong giao diện cho Activity ta code chức năng lưu một đoạn text vào bộ nhớ trong của thiết bị android. Đầu tiên ta tạo một file có tên internalStorage.txt trong bộ nhớ trong, hoặc mở file này nếu nó đã được tạo rồi bằng cách thêm dòng lệnh tại hàm onCreate:
1 2 3 4 5 6 |
ContextWrapper contextWrapper = <span class="hljs-keyword">new</span> ContextWrapper( getApplicationContext()); <span class="hljs-comment">//Tạo (Hoặc là mở file nếu nó đã tồn tại) Trong bộ nhớ trong có thư mục là ThuMucCuaToi.</span> File directory = contextWrapper.getDir(filepath, Context.MODE_PRIVATE); myInternalFile = <span class="hljs-keyword">new</span> File(directory, filename); |
Với filepath và filename là chuỗi miêu tả tên thư mục và tên file ta khai báo biến cục bộ ngoài hàm onCreate:
1 2 3 4 5 6 |
<span class="hljs-keyword">private</span> String filename = <span class="hljs-string">"internalStorage.txt"</span>; <span class="hljs-comment">//Thư mục do mình đặt</span> <span class="hljs-keyword">private</span> String filepath = <span class="hljs-string">"ThuMucCuaToi"</span>; File myInternalFile; |
Tiếp theo ta sẽ tạo các sự kiện khi click vào nút lưu và đọc ra dữ liệu tại bộ nhớ trong bằng hàm initView đẻ ánh xạ id với các đối tượng trên giao diện, và sau đó gọi initView trên hàm onCreate bằng dòng lệnh initView();
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Button btnSave, btnDisplay; EditText myInputText; TextView responseText; <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">initView</span><span class="hljs-params">()</span> </span>{ myInputText = (EditText) findViewById(R.id.myInputText); responseText = (TextView) findViewById(R.id.responseText); <span class="hljs-comment">// Các sự kiện</span> btnSave = (Button) findViewById(R.id.btnSave); btnSave.setOnClickListener(<span class="hljs-keyword">this</span>); btnDisplay = (Button) findViewById(R.id.btnDisplay); btnDisplay.setOnClickListener(<span class="hljs-keyword">this</span>); } |
Cuối cùng ta sẽ code chức năng cho sự kiện click và từng button lưu và đọc file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onClick</span><span class="hljs-params">(View v)</span> </span>{ String myData = <span class="hljs-string">""</span>; <span class="hljs-keyword">switch</span> (v.getId()) { <span class="hljs-keyword">case</span> R.id.btnSave: <span class="hljs-keyword">try</span> { <span class="hljs-comment">//Mở file</span> FileOutputStream fos = <span class="hljs-keyword">new</span> FileOutputStream(myInternalFile); <span class="hljs-comment">//Ghi dữ liệu vào file</span> fos.write(myInputText.getText().toString().getBytes()); fos.close(); } <span class="hljs-keyword">catch</span> (IOException e) { e.printStackTrace(); } myInputText.setText(<span class="hljs-string">""</span>); responseText .setText(<span class="hljs-string">"Đã được lưu vào bộ nhớ trong"</span>); <span class="hljs-keyword">break</span>; <span class="hljs-keyword">case</span> R.id.btnDisplay: <span class="hljs-keyword">try</span> { <span class="hljs-comment">//Đọc file</span> FileInputStream fis = <span class="hljs-keyword">new</span> FileInputStream(myInternalFile); DataInputStream in = <span class="hljs-keyword">new</span> DataInputStream(fis); BufferedReader br = <span class="hljs-keyword">new</span> BufferedReader( <span class="hljs-keyword">new</span> InputStreamReader(in)); String strLine; <span class="hljs-comment">//Đọc từng dòng</span> <span class="hljs-keyword">while</span> ((strLine = br.readLine()) != <span class="hljs-keyword">null</span>) { myData = myData + strLine; } in.close(); } <span class="hljs-keyword">catch</span> (IOException e) { e.printStackTrace(); } myInputText.setText(myData); responseText .setText(<span class="hljs-string">"Lấy dữ liệu từ bộ nhớ trong"</span>); <span class="hljs-keyword">break</span>; } } |
Vậy là xong, toàn bộ code tại MainActivity.java như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MainActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AppCompatActivity</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">View</span>.<span class="hljs-title">OnClickListener</span> </span>{ Button btnSave, btnDisplay; EditText myInputText; TextView responseText; <span class="hljs-comment">//Tên file được tạo</span> <span class="hljs-keyword">private</span> String filename = <span class="hljs-string">"internalStorage.txt"</span>; <span class="hljs-comment">//Thư mục do mình đặt</span> <span class="hljs-keyword">private</span> String filepath = <span class="hljs-string">"ThuMucCuaToi"</span>; File myInternalFile; <span class="hljs-meta">@Override</span> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span><span class="hljs-params">(Bundle savedInstanceState)</span> </span>{ <span class="hljs-keyword">super</span>.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); ContextWrapper contextWrapper = <span class="hljs-keyword">new</span> ContextWrapper( getApplicationContext()); <span class="hljs-comment">//Tạo (Hoặc là mở file nếu nó đã tồn tại) Trong bộ nhớ trong có thư mục là ThuMucCuaToi.</span> File directory = contextWrapper.getDir(filepath, Context.MODE_PRIVATE); myInternalFile = <span class="hljs-keyword">new</span> File(directory, filename); <span class="hljs-comment">//Gọi hàm initView</span> } <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">initView</span><span class="hljs-params">()</span> </span>{ myInputText = (EditText) findViewById(R.id.myInputText); responseText = (TextView) findViewById(R.id.responseText); <span class="hljs-comment">// Các sự kiện</span> btnSave = (Button) findViewById(R.id.btnSave); btnSave.setOnClickListener(<span class="hljs-keyword">this</span>); btnDisplay = (Button) findViewById(R.id.btnDisplay); btnDisplay.setOnClickListener(<span class="hljs-keyword">this</span>); } <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onClick</span><span class="hljs-params">(View v)</span> </span>{ String myData = <span class="hljs-string">""</span>; <span class="hljs-keyword">switch</span> (v.getId()) { <span class="hljs-keyword">case</span> R.id.btnSave: <span class="hljs-keyword">try</span> { <span class="hljs-comment">//Mở file</span> FileOutputStream fos = <span class="hljs-keyword">new</span> FileOutputStream(myInternalFile); <span class="hljs-comment">//Ghi dữ liệu vào file</span> fos.write(myInputText.getText().toString().getBytes()); fos.close(); } <span class="hljs-keyword">catch</span> (IOException e) { e.printStackTrace(); } myInputText.setText(<span class="hljs-string">""</span>); responseText .setText(<span class="hljs-string">"Đã được lưu vào bộ nhớ trong"</span>); <span class="hljs-keyword">break</span>; <span class="hljs-keyword">case</span> R.id.btnDisplay: <span class="hljs-keyword">try</span> { <span class="hljs-comment">//Đọc file</span> FileInputStream fis = <span class="hljs-keyword">new</span> FileInputStream(myInternalFile); DataInputStream in = <span class="hljs-keyword">new</span> DataInputStream(fis); BufferedReader br = <span class="hljs-keyword">new</span> BufferedReader( <span class="hljs-keyword">new</span> InputStreamReader(in)); String strLine; <span class="hljs-comment">//Đọc từng dòng</span> <span class="hljs-keyword">while</span> ((strLine = br.readLine()) != <span class="hljs-keyword">null</span>) { myData = myData + strLine; } in.close(); } <span class="hljs-keyword">catch</span> (IOException e) { e.printStackTrace(); } myInputText.setText(myData); responseText .setText(<span class="hljs-string">"Lấy dữ liệu từ bộ nhớ trong"</span>); <span class="hljs-keyword">break</span>; } } } |
Ta chạy chương trình và xem kết quả
Để biết file được tạo bởi chương trình nằm ở đâu, trong Android Studio ta vào Tools/Android/Android Device Monitor. Hộp thoại hiện lên ta chọn sang thẻ File Explorer và chọn đến data/data/app_trong_thiet_bi/thu_muc_ta_tao/file_vua_tao
Vậy là mình đã giới thiệu với các bạn cách lưu trữ giữ liệu và đọc giữ liệu từ bộ nhớ trong của thiết bị android. Khi ta xóa app chứa bộ nhớ trong này thì dữ liệu cũng sẽ bị xóa theo. Hy vọng bài viết này sẽ giúp các bạn học lập trình android hiểu rõ hơn về cách thức lưu trữ trong ứng dụng android.
Chúc các bạn thành công!!!