文件操作
1、私有文件操作
==私有文件目录==是指++在每个APP包中内部的目录文件,只允许本应用读取和写入++,目录为:/data/data/[package_name]/files/xxx,(xxx表示文件名),操作私有文件有两种模式:
Context.MODE_PRIVATE 覆盖模式
Context.MODE_APPEND 追加模式
写入私有文件使用openFileOutput获取输出流
读取私有文件使用openFileInput获取输入流
写入示例:
public void writerPrivateClick(View view){
try {
//打开私有目录,并写入一个文件,文件是mly,模式为:覆盖模式
//Context.MODE_APPEND:表示追加模式
//此文件存储在:/data/data/[package_name]/files/mly
FileOutputStream out = openFileOutput("mly", Context.MODE_PRIVATE);
BufferedOutputStream bos = new BufferedOutputStream(out);
String info = "hello moliying";
bos.write(info.getBytes());
bos.close();
Toast.makeText(MainActivity.this, "success", Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
读取示例:
public void readPrivateClick(View view){
try {
//打开私有文件(mly)
FileInputStream input = openFileInput("mly");
BufferedInputStream in = new BufferedInputStream(input);
byte[] bytes = new byte[1024];
int len = -1;
StringBuilder buf = new StringBuilder();
while((len=in.read(bytes))!=-1){
buf.append(new String(bytes,0,len));
}
in.close();
Toast.makeText(MainActivity.this, buf, Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
2、raw文件的读取(不能写)
raw表示原生文件资源目录(让你用的)
//读取raw原生文件
public void rawReadClick(View v) {
InputStream input = getResources().openRawResource(R.raw.mly);
try {
BufferedInputStream in = new BufferedInputStream(input);
byte[] bytes = new byte[1024];
int len = -1;
StringBuilder buf = new StringBuilder();
while ((len = in.read(bytes)) != -1) {
buf.append(new String(bytes, 0, len));
}
in.close();
Toast.makeText(MainActivity.this, buf, Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
3、获取私有缓存目录
我们应该维护缓存目录的大小,比如1MB,不要把大量数据使用私有缓存来存储
getCacheDir()
4、FileUtils工具类
/**
* 判断外部存储设备是否可写
* @return
*/
public static boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
/**
* 判断外部存储设备是否可读
* @return
*/
public static boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}
/**
* 获取sdcard根目录
* @return
*/
public static String getSdcardPath(){
return Environment.getExternalStorageDirectory().getPath();
}
5、获取sdcard特定目录:
/**
* 获取特定目录
* @param view
*/
public void getSpecialDirClick(View view){
//下载目录
System.out.println(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DOWNLOADS));
//视频目录
System.out.println(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_MOVIES));
//音乐目录
System.out.println(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_MUSIC));
//图片目录
System.out.println(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES));
//警报铃声目录
System.out.println(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_ALARMS));
//像机拍照目录
System.out.println(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM));
//文档目录
System.out.println(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DOCUMENTS));
//通知目录
System.out.println(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_NOTIFICATIONS));
//博客铃声目录
System.out.println(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PODCASTS));
//铃声目录
System.out.println(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_RINGTONES));
}
6、获取外部存储设备的私有化目录
android给我们提供了在sdcard上实现私有化数据的存储,文件存储在:
/sdcard/Android/data/[package_name]/files
/sdcard/Android/data/[package_name]/cache
两个目录分别对应系统应用程序管理的清除数据和清除缓存
注意:
卸载应用时,android系统会默认删除以下目录:
(1)本应用的内部存储的数据
(2)本应用的外部存储的私有数据和缓存
在实际开发中,通常应用除了在私有目录(内部或外部)保存私密数据,也会在sdcard目录下创建公有目录,来存放可以公开的数据。