getCacheDir()方法用于获取/data/data/<application package>/cache目录
getFilesDir()方法用于获取/data/data/<application package>/files目录
应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的。
大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中。
这样当该应用被卸载后,这些数据还保留在SDCard中,留下了垃圾数据。
如果你想让你的应用被卸载后,与该应用相关的数据也清除掉,该怎么办呢?
通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/data/你的应用的包名/ 这个目录下的所有文件都会被删除,不会留下垃圾信息。
较优秀的程序都会专门写一个方法来获取缓存地址,如下所示:
public String getDiskCacheDir(Context context) {
String cachePath = null;
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
|| !Environment.isExternalStorageRemovable()) {
cachePath = context.getExternalCacheDir().getPath();
} else {
cachePath = context.getCacheDir().getPath();
}
return cachePath;
}
可以看到,当SD卡存在或者SD卡不可被移除的时候,就调用getExternalCacheDir()方法来获取缓存路径,否则就调用getCacheDir()方法来获取缓存路径。前者获取到的就是 /sdcard/Android/data/<application package>/cache 这个路径,而后者获取到的是 /data/data/<application package>/cache 这个路径。
数据存储:
1.内存
2.内存设备--->应用名--->(cache/files/其他名字):用的少
3.内存设备--->Android--->data--->应用名--->(cache/files/其他名字):用的多
4.sd卡--->应用名--->(files/cache/其他名字):用得少
5.sd卡--->Android--->data--->应用名--->(cache/files/其他名字):用的多
getCacheDir()用法示例
public class MainActivity extends Activity {
private EditText et_name;
private EditText et_pass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_name = (EditText) findViewById(R.id.et_name);
et_pass = (EditText) findViewById(R.id.et_pass);
read();
}
//读取文件
public void read(){
//使用api读取路径,下面2种方法效果一样
//File file = new File("data/data/com.ldw.rwinrom/12.txt");
File file = new File(getFilesDir(),"123.txt");
if(file.exists()){
try {
FileInputStream fis = new FileInputStream(file);
//把字节流转换成字符流
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
//读取txt里面的数据,readLine可以读取一行数据
String text = br.readLine();
String[] s = text.split("==");
et_name.setText(s[0]);
et_pass.setText(s[1]);
fis.close();
br.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//点击登陆写文件
public void login(View v){
CheckBox cb = (CheckBox) findViewById(R.id.cb);
String name = et_name.getText().toString();
String password = et_pass.getText().toString();
if(cb.isChecked()){
//data/data/com.ldw.rwinrom:存储空间的路径
//File file = new File("data/data/com.ldw.rwinrom/12.txt");
File file = new File(getFilesDir(),"123.txt");
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write((name + "==" + password).getBytes());
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Toast.makeText(this, "登陆成功", Toast.LENGTH_SHORT).show();
}