转载请标明出处:http://blog.csdn.net/htwhtw123/article/details/72493301
谷歌的官网讲解:保存文件
这里提供Android 文件操作,具体内容有:
1.写文件,存于任意路径
2.读文件,读任意路径
3.用openFileOutput写文件,写于data/data/app的包名/files文件夹下
4.用openFileInput读文件,读data/data/app的包名/files文件夹下文件
5.创建文件夹.
6.删除文件夹及其下文件及文件夹
7.字节方式读写文件(支持音频文件读写和视频文件读写,且速度较快)
8.SharedPreferences 存储与文件删除
9.读写外部存储设备
注意:在非应用目录文件路径读写文件或者读写外置内存目录文件时,需要赋予APP读写删的权限;应用目录文件路径获取:getFilesDir()(只有本应用有读写权限)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
如果运行在Android 6.0及其以上的设备,请在读写非应用内部路径的内存前,写下动态申请内存读写权限的代码:
//请求应用内存读写权限
public void requestPower() {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}
}
}
需要申请权限
(1)以覆盖方式写文件:
//path为文件保存路径包含文件名,msg为需要写入的内容
public static void writeFile(String path, String msg) {
FileOutputStream outStream;
File file =new File(path);
try {
outStream = new FileOutputStream(file);
} catch (FileNotFoundException e) {
return;
}
try {
outStream.write(msg.getBytes());
} catch (Exception e) {
} finally {
try {
outStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
(2)追加方式写文件:
//path为文件路径(包含文件名)
public void writeFileAppend(String path, String conent) {
BufferedWriter out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(new File(path), true)));
out.write(conent);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
需要申请权限
//path为文件路径(包含文件名),方法返回值为读取文件内容
static String read(String path){
String result = "";
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(new File(path)));
String temp;
while ((temp= br.readLine())!=null)
result += temp;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(br!=null)
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
写的文件位置:data/data/app的包名/files/自命名文件,不需要申请内存读写权限
openFileOutput和openFileInput读写模式
常量 含义
MODE_PRIVATE 默认模式,文件只可以被调用该方法的应用程序访问
MODE_APPEND 如果文件已存在就向该文件的末尾继续写入数据,而不是覆盖原来的数据。
MODE_WORLD_READABLE 赋予所有的应用程序对该文件读的权限。
MODE_WORLD_WRITEABLE 赋予所有的应用程序对该文件写的权限。
//以下为私有覆盖的方式写文件:
private void save(String fileName,String data) {
FileOutputStream out=null;
BufferedWriter writer = null;
try {
out = openFileOutput(fileName, Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(data);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
if(out!=null){
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
读data/data/app的包名/files/自命名文件,不需要申请读写内存的权限
private String read(String fileName) {
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
in = openFileInput(fileName);
reader = new BufferedReader(new InputStreamReader(in));
String line = "";
while ((line = reader.readLine()) != null) {
content.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}
//在根路径下创建文件夹folder:
static final String rootPath= Environment.getExternalStorageDirectory().getPath()+"/";
File file=new File(rootPath+"folder");
if(!file.exists()){
file.mkdir();
}
public void deleteFolderFile(String filePath) {
if (!TextUtils.isEmpty(filePath)) {
try {
File file = new File(filePath);
if (file.isDirectory()) {
File files[] = file.listFiles();
for (int i = 0; i < files.length; i++) {
deleteFolderFile(files[i].getAbsolutePath());
}
}
if (!file.isDirectory()) {
file.delete();
} else {/
if (file.listFiles().length == 0) {/
file.delete();
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
注:当用户卸载应用时,Android 系统会删除以下各项:
1.保存在内部存储中的所有文件
2.使用 getExternalFilesDir() 保存在外部存储中的所有文件。
//以追加的方式写文件
public static void writeFileAppend(String path, byte[]b) {
FileOutputStream fs = null;
BufferedOutputStream bos = null;
try {
fs = new FileOutputStream(new File(path), true);//这里改成false则为覆盖的方式写文件
bos = new BufferedOutputStream(fs);
bos.write(b);
bos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fs != null)
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (bos != null) {
bos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//读文件
public static byte[] readFile(String path) {
int len= (int) new File(path).length();
byte b[] = new byte[len];
StringBuffer result=new StringBuffer();
BufferedInputStream bis = null;
FileInputStream fi = null;
try {
fi = new FileInputStream(new File(path));
bis = new BufferedInputStream(fi);
int temp;
int i=0;
while ((b[i] = (byte)bis.read()) != -1) {
i++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fi != null) {
try {
fi.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return b;
}
以键值对方式存储,存储位置为:data/data/app的包名/shared_prefs/自命名文件.xml。不需要内存读写权限。
主要有两种模式可以选
MODE_PRIVATE: 只有当前的应用程序才可以对这个SharedPreferences文件进行读写
MODE_MULTI_PROCESS:多个应用对同一个 SharedPreferences文件进行读写
以下为MODE_PRIVATE情况的示例
(1)把数据存入SharedPreferences例子(存入到文件名为data.xml的文件中):
SharedPreferences.Editor editor = getSharedPreferences("data",
MODE_PRIVATE).edit();
editor.putString("name", "Tom");
editor.putInt("age", 28);
editor.putBoolean("married", false);
editor.commit();
(2)取出SharedPreferences中的数据(将刚刚存的数据取出):
SharedPreferences pref = getSharedPreferences("data",
MODE_PRIVATE);
String name = pref.getString("name", "");
int age = pref.getInt("age", 0);
boolean married = pref.getBoolean("married", false);
(3)清空SharedPreferences中的数据:
SharedPreferences sp = getSharedPreferences("data", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.clear();
editor.commit();
注意:此处清空指不再有可以取出的数据,实际上data.xml依旧存在,并且依旧存在少量字符。
(4)彻底清除SharedPreferences的文件,其实就是使用一般的文件删除的方法就可以,依旧不需要内存读写权限。以下举例之前生成的删除data.xml。
String filePath="data/data/getPackageName().toString()/shared_prefs";
File file = new File(filePath, "userData.xml");
if (file.exists()) {
file.delete();
}
需要申请权限
检查外部存储设备是否可以读写:
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
外部存储文件分两种:
公共文件:
供其他应用和用户自由使用的文件。 当用户卸载应用时,用户应仍可以使用这些文件。
私有文件
属于您的应用且在用户卸载您的应用时应予删除的文件。(实际上其他应用也可以访问)
获取公共文件的相册文件夹对象:
File file=Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
获取外部存储上应用的专用目录的根目录:
getExternalFilesDir(null) ;
String filePath="data/data/getPackageName().toString()/shared_prefs";
File file = new File(filePath, "userData.xml");
if (file.exists()) {
file.delete();
}