安卓学习日记——文件管理
1、使用内部存储器
2、使用外部存储器
- 内部存储器
你可以直接保存文件在设备的内部存储。默认情况下,文件保存在你的应用程序的内部存储,其他应用程序或用户不能访问。当用户卸载你的应用程序中,这些文件被删除。
(一)在内部存储创建并写入私有文件:
1、调用openFileOutput(name,model)方法,返回一个FileOutputStream,name参数用于指定文件名称,不能包含路径分隔符“/”,如果文件不存在,会自动创建它。创建的文件保存在/data/data//files/目录中,model参数指的是使用模式,分别有:
MODE_PRIVATE:私有(创建此文件的应用能够使用,其他应用不能访问),写入文件会覆盖原来的内容
MODE_APPEND:私有,在原来内容上增加数据MODE_WORLD_READABLE,MODE_WORLD_WRITEABLE:可以被其他应用读取或写入(API17版本中已废弃)不建议使用
2、调用write方法把数据写入文件
3、调用close方法关闭流
写入私有文件
public void writePrivateFileClick(View v){
try {
OutputStream out=openFileOutput("ska.txt", Context.MODE_PRIVATE);
String info="我骄傲";
byte[] bytes=info.getBytes();
out.write(bytes,0,bytes.length);//写入
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
读取私有文件
public void readPrivateFileClick(View v){
try {
InputStream in=openFileInput("ska.txt");
byte[] bytes=new byte[1024];
StringBuffer sb=new StringBuffer();
int len=-1;
while((len=in.read(bytes))!=-1){
sb.append(new String(bytes,0,len));
}
in.close();
Toast.makeText(this,sb,Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
读取raw文件
public void readRAWFileClick(View v){
try {
InputStream in=getResources().openRawResource(R.raw.sa);
byte[] bytes=new byte[1024];
StringBuffer sb=new StringBuffer();
int len=-1;
while((len=in.read(bytes))!=-1){
sb.append(new String(bytes,0,len));
}
in.close();
Toast.makeText(this,sb,Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
效果展示
写入私有缓存数据
public void writePrivateCahceDataClick(View v){
try {
//创建一个缓存文件
File temp= File.createTempFile("temp",null,getCacheDir());
FileOutputStream out=new FileOutputStream(temp);
PrintStream ps=new PrintStream(out);
ps.println("我可是要成为编程王的男人啊");
ps.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
- 外部存储器
所有兼容Android的设备都支持一个可共享的“外部存储(external storage)”,可用来保存文件。这可以使一个可移动的存储设备(比如SD卡)或者一个内部(不可移动的)存储。保存在外部存储的文件是可读的。并且当用于传输数据的USB大容量存储选项启用时,用户能够在计算机上修改它们。
访问SDcard路径
以前的Android(4.1之前的版本)中,SDcard路径通过“/sdcard”或者“/mnt/sdcard”来表示,而在Jelly Bean系统中修改为了“/storage/sdcard0”,以后可能还会有多个SDcard的情况。为了使代码更加健壮并能兼容以后的Android版本和新设备,请通过Environment.getExternalStorageDirectory().getPath()来获取sdcard路径。
public void isSDCardClick(View v){
//判断是否有SDCard
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
Toast.makeText(this,"有SDCard",Toast.LENGTH_SHORT).show();
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY)){
Toast.makeText(this,"SDCard只读",Toast.LENGTH_SHORT).show();
}else {
//sdcard路径
System.out.println(Environment.getExternalStorageDirectory().getPath());
//访问android内置的文件夹
System.out.println(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS));
}
}
else {
Toast.makeText(this,"没有SDCard",Toast.LENGTH_SHORT).show();
}
}
(二)Saving files that are app-private(保护文件私有化)4.4版本(API 19)可用
为了文件的保密性,你必须保证自己的文件不让其他app读取。你可以使用getExternalFilesDir(type),type为null为默认。
再次注意,getExternalFilesDir(),这个方法,不一定总能够访问sd卡中的消息。
如果设备自身已经有了一部分内部存储当做外部存储,那这个方法就不能访问到sd。
当用户卸载应用程序,Android系统删除以下:
(1)你保存在内部存储的所有文件
(2)所有使用本应用外部存储的私有文件
(三)查询空闲空间
如果你事先知道要存储的数据量的大小,你就可以先查询一下可用空间有多少,这样就可以避免IOException,可用的方法是:
getFreeSpace()—返回剩余空间
getTotalSpace()—返回总空间
但是返回的可用空间大小,并不说明,你就可以存入那么多的数据。如果空间比你要存入的数据大几M,或者空间被占用率小于90%,都还可以,反之,就未必能存入。
并不需要每次存文件之前都来这么个判断,加个异常捕捉就OK。而且,你也未必知道你要存入的数据有多大,你想判断,也没法判断的,所以能catch这个IOEception就行。