文件管理:
1、内部存储操作
内部存储数据,是由本应用程序访问的私有数据,保存在/data/data/package_name/files/文件名 下可以通过以下两个方法读取和写入私有数据:
<1>写入私有数据:
context.openFileOutput(name,mode)name:自定义的文件名
mode:写入的模式:Context.MODE_PRIVATE 覆盖写入,Context.MODE_APPEND 追加写入
通常使用MODE_PRIVATE
由于不同的设备对手机每个应用的大小有限制,通过在几十M,所以,不建议把大量数据写入私有文件,
通常可以保存一些重要的用户数据(比如,密码等)
示例:
String info = "程序员好帅";
try {
BufferedOutputStream out = new BufferedOutputStream(openFileOutput("mly", Context.MODE_PRIVATE));
out.write(info.getBytes());
out.close();
Toast.makeText(MainActivity.this, "write success", Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
<2>读取私入数据:
context.openFileInput(name)name:已经存在的自定义文件名
示例:
try {
BufferedInputStream in = new BufferedInputStream(openFileInput("mly"));
StringBuilder buf = new StringBuilder();
byte[] bytes = new byte[1024*100];
int len = -1;
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>操作raw目录的文件(原生)res/raw
raw文件中资源文件的一种,只能读取,不能写入可以存放一些声音资源文件
1>通常使用该资源实现数据的初始化工作:
在程序第一次运行时,读取该资源数据,执行相应的操作,比如(初始化数据库数据)public void readRAWClick(View v){
BufferedInputStream in = new BufferedInputStream(getResources().openRawResource(R.raw.sql));
StringBuilder buf = new StringBuilder();
byte[] bytes = new byte[1024];
int len = -1;
try {
while((len=in.read(bytes))!=-1){
buf.append(new String(bytes,0,len));
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
//读取到的SQL语句,再去执行
}
2>实现文件的加密处理
在一个应用程序中,需要安装其它APK,通常会把这个APK文件与当前程序一起打包,在安装时同时安装这个APK,一些安全类APP可能扫描到这个而外安装的APK文件,以提醒用户,为了防止安全类应用扫描,我们会把这个APK文件进行加密处理,放到RAW资源目录中,在执行某一个操作时,读取这个加密文件,并生成(还原)APK,保存到SDCARD上,再执行安装操作例如:
在实现支付操作时,需要安装支付插件,我们就把支付插件加密后保存在RAW目录中。
<3>asserts
存放资源文件,不会生成索引原生文件通常在该目录下存放,网页文件、数据库数据文件、APK文件,不会受res资源的相关限制
<4>操作内部缓存目录:
系统在内存低的情况下,会自动清除缓存,但通常我们应该自己维护缓存一般大小在1MB
Log.i("cache",getCacheDir().toString());
try {
//创建一个临时文件(前缀,后缀,文件目录)
File file = File.createTempFile("mly","tmp",getCacheDir());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
bos.write("今天下雨了".getBytes());
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
<5> 外部存储(sdcard)
检查sdcard:
public static boolean isExternalStorageWritable(){
String state = Environment.getExternalStorageState();
//判断是否存在外部存储设备(可写)
if(Environment.MEDIA_MOUNTED.equals(state)){
return true;
}
return false;
}
public static boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
//判断sdcard是否可读
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}
获取sdcard的根目录:
public static String getSDCardPath(){
return Environment.getExternalStorageDirectory().getPath();
}
通配符:sdcard
获取外部私有目录(4.4)
/**
* 获取外部存储的私有目录(4.4)
* @param context
* @return
*/
public static File getExternalFilesDir(Context context){
File file = context.getExternalFilesDir(null);
if(file==null){
file = new File(Environment.getExternalStorageDirectory()+EXTERNAL_FILE_DIR);
}
return file;
}
/**
* 获取外部存储的私有缓存目录(4.4)
* @param context
* @return
*/
public static File getCacheDir(Context context){
File file = context.getExternalCacheDir();
if(file==null){
file = new File(Environment.getExternalStorageDirectory()+EXTERNAL_CACHE_DIR);
}
return file;
}
获取sdcard的总空间大小和可用空间大小
/**
* 获取sdcard的可用空间大小
* @return
*/
public static long getFreeSpace(){
return Environment.getExternalStorageDirectory().getFreeSpace();
}
/**
* 获取sdcard的总空间大小
* @return
*/
public static long getTotalSpace(){
return Environment.getExternalStorageDirectory().getTotalSpace();
}
获取sdcard上自带的指定目录:
//图片
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
//警报声音,闹钟声音
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS)
//相机
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
//文档
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
//下载
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
//视频
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)
//音乐
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)
//通知
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_NOTIFICATIONS)
//博客
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PODCASTS)
//铃声
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES)
注意:
在实际开发中,我们通常会使用sdcard来作为本应用程序的缓存位置,我们可以在sdcard上创建一个
属于本应用程序使用的自定义目录(通过存放一些非敏感的数据)
敏感数据一般放在sdcard上的私有目录(sdcard/Andorid/data/package_name/...下,或
应用程序下的私有目录:data/data/package_name/files/... 或/cache/...)
面试题:问Android存储数据的方式有哪些:
Shared Preferences(共享属性文件)
Internal Storage(内部存储)
External Storage(外部存储)
SQLite Databases(SQLite数据库)
Network Connection(网络)
对sdcard的读写操作必须添加权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>