Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 2.3.1 存儲數據到data目錄中

2.3.1 存儲數據到data目錄中

編輯:關於Android編程

當應用安裝到Android後,系統會根據每個應用的包名創建一個/data/data/包名/的文件夾,訪問自己包名下的目錄是不需要權限的,並且Android已經提供了非常簡便的API可以直接去訪問該文件夾。

下面以一個案例來演示data目錄的使用。

 

一、需求

如圖1-5 所示,在用戶將CheckBox選中的前提下點擊登錄,就將用戶名和密碼保存在data文件夾中,在用戶不勾選CheckBox的前提下點擊登錄,就不保存用戶名和密碼,同時刪除data文件中的歷史數據。

如果數據已經保存到了data目錄中,那麼下次用戶重新啟動該界面的時候要求可以將用戶名和密碼回顯到界面。


二、編寫布局
【文件1-4】 activity_main.xml

 

1. 
6. 
7.     
13.     
20.     
24.         
31.
三、編寫代碼
【文件1-5】 MainActivity.java

 

 

1. package com.itheima.android.save.data;
2. 
3. import java.io.BufferedReader;
4. import java.io.File;
5. import java.io.FileInputStream;
6. import java.io.FileOutputStream;
7. import java.io.InputStreamReader;
8. import android.os.Bundle;
9. import android.app.Activity;
10. import android.text.TextUtils;
11. import android.view.View;
12. import android.widget.CheckBox;
13. import android.widget.EditText;
14. import android.widget.Toast;
15. /**
16.  * 
17.  * @author wzy 2015-10-23 
18.  * 將用戶名和密碼保存到data目錄
19.  *
20.  */
21. public class MainActivity extends Activity {
22. 
23. 	private EditText et_name;
24. 	private EditText et_pwd;
25. 	private CheckBox cb;
26. 
27. 	@Override
28. 	protected void onCreate (Bundle savedInstanceState){
29. 		super.onCreate(savedInstanceState);
30. 		setContentView(R.layout.activity_main);
31. 		//獲取控件對象
32. 		et_name = (EditText) findViewById(R.id.et_name);
33. 		et_pwd = (EditText) findViewById(R.id.et_pwd);
34. 		cb = (CheckBox) findViewById(R.id.cb);
35. 		/*
36. 		 * 數據的回顯
37. 		 * getFilesDir()方法是父類提供的方法可以直接訪問data/data/包名/files目錄
38. 		 */
39. 		File file = new File(getFilesDir(), "info.txt");
40. 		//如果文件存在則回顯數據
41. 		if (file.exists()) {
42. 			try {
43. 				/*
44. 				 * openFileInput(String)是父類提供的方法,
45. 				 * 可以直接獲取data目錄下指定文件的的輸入流
46. 				 */
47. 				FileInputStream fis = openFileInput("info.txt");
48. 				//將文件輸入流轉化為緩存流
49. 				BufferedReader bf = new BufferedReader(new InputStreamReader(fis));
50. 				//因為保存時數據只有一行,因此讀取一次就可以
51. 				String readLine = bf.readLine();
52. 				bf.close();
53. 				/*
54. 				 * 數據是用戶名##密碼的形式存儲的,
55. 				 * 因此需要根據##對字符串進行切割
56. 				 */
57. 				String[] split = readLine.split("##");
58. 				//給EditText控件設置數據
59. 				et_name.setText(split[0]);
60. 				et_pwd.setText(split[1]);
61. 				//讓CheckBox變為勾選狀態,默認不勾選
62. 				cb.setChecked(true);
63. 			} catch (Exception e) {
64. 				e.printStackTrace();
65. 			}
66. 		}
67. 	}
68. 
69. 	/*
70. 	 * 給登錄按鈕綁定的點擊事件
71. 	 */
72. 	public void login(View view) {
73. 		//從EditText中獲取數據
74. 		String name = et_name.getEditableText().toString().trim();
75. 		String pwd = et_pwd.getText().toString().trim();
76. 		//校驗數據
77. 		if (TextUtils.isEmpty(name)||TextUtils.isEmpty(pwd)) {
78. 			/*
79. 			 * 這裡使用到了makeText的方法的重載形式,第二個參數是int類型,
80. 			 * 其對應values/strings.xml資源文件中的字符串常量
81. 			 */
82. 			Toast.makeText(this, R.string.info_txt, Toast.LENGTH_SHORT).show();
83. 			return;
84. 		} 
85. 		//獲取CheckBox的選中狀態
86. 		boolean checked = cb.isChecked();
87. 		//保存數據 name##pwd
88. 		File file = new File(getFilesDir(), "info.txt");
89. 		if (checked) {
90. 			try {
91. 				/*
92. 				 * openFileOutput()方法是父類提供的直接打開data目中中指定文件的輸出流,
93. 				 * 輸出地址:/data/data/包名/files/info.txt
94. 				 */
95. 				FileOutputStream fos = openFileOutput("info.txt", MODE_PRIVATE);
96. 				fos.write((name+"##"+pwd).getBytes());
97. 				fos.close();
98. 				
99. 			} catch (Exception e) {
100. 				e.printStackTrace();
101. 			}
102. 		}else {
103. 			//如果用戶沒有勾選CheckBox則刪除歷史文件
104. 			if (file.exists()) {
105. 				boolean delete = file.delete();
106. 				if (delete) {
107. 					Toast.makeText(this, "刪除成功", Toast.LENGTH_SHORT).show();
108. 				}else {
109. 					Toast.makeText(this, "刪除失敗", Toast.LENGTH_SHORT).show();
110. 				}
111. 				
112. 			}else {
113. 				Toast.makeText(this, "該文件不存在,
114. 不用刪除", Toast.LENGTH_SHORT).show();
115. 			}
116. 		}
117. 	}
118. }
119. 

 

注意:

上面使用到了如下方法,這些方法都是在ContextWrapper類中定義的,是Activity的父類,因此可以直接使用。

getFilesDir():直接獲取 /data/data/包名/files文件

openFileInput("info.txt"):直接打開/data/data/包名/files/info.txt文件

openFileOutput("info.txt",MODE_PRIVATE):直接創建 /data/data/包名/files/info.txt文件

在開發過程中凡是涉及到data目錄操作的,很少自己去創建輸入流和輸出流,而應該盡量去使用Google已經提供的方法。

openFileOutput("info.txt",MODE_PRIVATE)方法的第二個參數是設置文件的權限,這裡使用了私有常量值,也就是只能當前應用訪問該文件。關於文件權限的詳細介紹請看1.3.3節。

1.3.3 文件的權限

Android是基於Linux的操作系統,因此Android的文件權限其實就是Linux的文件權限。

在Linux中一個文件一共有三個組別:用戶、群組、其它。其中每個組包含三種權限:讀r、寫w、執行x ,也就是說一個文件共有9個權限屬性(如圖1-6所示)。

 

\

 

圖1-6中的第一個屬性代表文件類型,不屬於權限范疇。剩下的9位從左往右1到3位是[用戶],4到6位是[群組],7到9位是[其它]。

舉例:通過DDMS的File Explorer查看文件信息(如圖1-7),可以看到某個文件的權限為:-rwxrw-r--

他的意思就是[用戶]對其享有讀寫執行的權限,[群組]享有讀寫權限,[其它]享有讀權限。

 

\
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved