文件管理
使用内部存储器
你可以直接保存文件在设备的内部存储。默认情况下,文件保存在你的应用程序的内部存储,其他应用程序或用户不能汸问 。当用户卸载你的应用程序中,这些文件被刪除。
(一)在内部存储创建并写入私有文件:
1,调用〇penFileOutput(name,model)方法,返回一个FileOutputStream,name参数用于指定文件名称,不能包含路径分隔符 “/”,如果文件不存在,会自动创建它。创建的文件保存在/data/data//files/目录中,model参数指的是 使用模式,分别有:
MODE_PRIVATE:私有(创建此文件的应用能够使用,其他应用不能汸问),写入文件会覆盖原来的内容
MODE_PPEMD:私有,在原有内容上增加数椐
MODE_WORLD_RMDABLE,MODE_WORLD_WRITEABLE :可以被其他应用读取或写API17版本中已废弃)不建议使用
2、 调用write方法把数椐写入文件
3、 调用close方法关闭流
(二)读取内部存储的私有文件:
1、 调用 openFilelnput(name)方法,返回一个FilelnputStream,name指的是文件名
2、 调用read方法读取文件字节
3、 调用close方法关闭流
如果想要问res/raw/目录下的原生文件,可以通过openRawResource(),传入R.raw.资料ID,就可以返回一个 InputStream,该文件为只读文件,不能对其执行写入操作。
/**
* 写入私有文件
*
* @param view
*/
public void writePrivateFileClick(View view) {
try {
FileOutputStream out = openFileOutput("lulu.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();
}
}
/**
* 读取私有文件
*
* @param view
*/
public void readPrivateFileClick(View view) {
try {
InputStream in = openFileInput("lulu.txt");
byte[] bytes = new byte[1024];
int len = -1;
StringBuffer stringBuffer = new StringBuffer();
while ((len = in.read(bytes)) != -1) {
stringBuffer.append(new String(bytes, 0, len));
}
in.close();
Toast.makeText(MainActivity.this, stringBuffer.toString(), Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 读取原生RAW文件
* @param view
*/
public void readRAWFileClick(View view) {
try {
InputStream in = getResources().openRawResource(R.raw.lulu);
byte[] bytes = new byte[1024];
int len = -1;
StringBuffer stringBuffer = new StringBuffer();
while ((len = in.read(bytes)) != -1) {
stringBuffer.append(new String(bytes, 0, len));
}
in.close();
Toast.makeText(MainActivity.this, stringBuffer.toString(), Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
(三)保存内部缓存文件
如果你想缓存一些数椐,而不是永久保存,可以使用getCacheeDir()打幵文件所在的目录,代表内部应用程序应保存临时缓存 文件。
当设备的内部存储空间低,Android可以刪除这些缓存文件以回收空间。然而,你不应该依赖系统来为你清除这些文件。你应该自己维护缓存文件,并保持在一个合理的消耗空间的限制,如1MB。当用户卸载你的应用程序,这些文件被刪除。
通过getCacheeDir()获取的目录为:/data/data/< package name> /cache
实例代码如下
//写入一个缓存文件
public void writePrivateCacheClick(View view) {
//创建一个缓存的临时文件
try {
// File.createTempFile(前缀, 后缀, 文件目录), 创建一个临时文件
// File temp = File.createTempFile("temp",null, getCacheDir());
File temp = new File(getCacheDir() + "/temp.txt");
System.out.println(temp.toString());
FileOutputStream out = new FileOutputStream(temp);
PrintStream ps = new PrintStream(out);
ps.println("我是编程王!!");
ps.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void readPrivateCacheClick(View view) {
//获取到文件路径
try {
File temp = new File(getCacheDir() + "/temp.txt");
BufferedInputStream buf = new BufferedInputStream(new FileInputStream(temp));
int len = -1;
byte[] bytes = new byte[1024];
StringBuffer stringBuffer =new StringBuffer();
while ((len = buf.read(bytes)) != -1) {
stringBuffer.append(new String(bytes, 0, len));
}
Toast.makeText(MainActivity.this, stringBuffer.toString(), Toast.LENGTH_SHORT).show();
buf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
其他有用的方法
- getFileDir() 获取私有文件目录: /data/data/< package name> /files
- getDir(name, model) 创建(或打开已存在)目录: /data/data/< package name> /app_文件名
- deleteFile(name) 删除私有目录的文件: /data/data/< package name> /files
- filesLIst() 获取/data/data/< package name> /files目录下的文件名数组
使用外部存储器
所欲兼容Android的设备都支持一个可共享的”外部存储(external storage)”, 可用来保存文件. 这可以使一个可移动的存储设备(如SD卡)或者一个内部的(不可移动的)存储. 保存在外部存储的文件是可读的. 并且当用于传输数据的USB大容量存储选项启用时, 用户能够在计算机上修改他们.
(一), 获取外部存储权限
<!--读权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!--写权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
既要读也要写权限, 可须添加写权限就好
注意: 在4.4中, 如果外部的文件私有化, 你可以不需要修改这些权限
(二) 检查媒体的可用性
在使用外部存储来保存数据时, 我们应该使用getExternalStorage()来检查当前设备是否存在外部存储设备(SD卡):
(三) 访问sdcard的路径
以前Android4.1 之前的版本中, SDcard路径通过”/sdcard”或者”/mnt/sdcard” 来表示, 而在Jelly Bean系统中修改为了”/storage/sdcard0”, 以后还会有多个SDcard的情况. 目前为了报纸和之前代码的兼容, sdcard路径做了link映射
为了使代码更加的健壮并能兼容以后的Android版本和新设备, 请通过Environment.getExternalStorageDirectory().getPath();获取路径
示例代码:
//判断当前设备的外部存储设备是否可用, 可用的情况下打印SDCard的路径
public void isSDCardClick(View view){
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
Toast.makeText(MainActivity.this, "存在SD卡", Toast.LENGTH_SHORT).show();
//判断当前设备是否为只读
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY)){
Toast.makeText(MainActivity.this, "并且SD卡为只读", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, Environment.getExternalStorageDirectory().getPath(), Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(MainActivity.this, "不存在SD卡", Toast.LENGTH_SHORT).show();
}
}
如果想要往sdcard保存特定类型的内容, 可以考虑使用Environment.getExternalStoragePublicDirectory(String type);,该函数可以返回特定类型的目录
(四) 外部存储器保存私有文件 4.4版本(api19) 可用
为了文件的保密性, 你必须保证自己的文件不让其他app读取. 你可以使用getExternalFilesDir(type), type为null表示为默认类型
通过getExternalFilesDir(); 方法获取到SDCard/Android/data/包名/files/目录, 一般放一些长时间保存的数据.
**注意, getExternalFilesDir(). 这个方法不一定总能访问sd卡中的信息..
如果设备自身已经有了一部分内部存储当作外部存储, 那这个方法就访问不到sd卡.**
当用用户卸载应用程序时, Android系统会删除以下内容:
- 你保存在内部存储的所有文件
- 所有使用本应用外部存储的私有文件
(五) 外部存储保存私有缓存文件
通过getExternalCacheDir(); 方法可以获取到SDCard/Android/data/包名/cache/目录, 一般存放临时缓存数据
卸载时全部清空不会留下垃圾.
示例代码:
//写入SDCard私有文件
public void writeSDCardPrivateFileClick(View view){
File file = getExternalFilesDir(null);
if(file != null){
try {
FileOutputStream out = new FileOutputStream(file + "/lulu.txt");
PrintStream ps = new PrintStream(out);
ps.print("钓鱼岛是中国的");
ps.close();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//写入SDCard私有缓存文件
public void writeSDCardPrivateCacheFileClick(View view){
File file = getExternalCacheDir();
if(file != null){
try {
FileOutputStream out = new FileOutputStream(file + "lulu.txt");
PrintStream ps = new PrintStream(out);
ps.print("钓鱼岛就是中国的!!");
ps.close();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
(六) 查询空闲空间
- getFreeSpace()–返回剩余空间
- getTotalSpace()–返回总空间