Android使用与其余平台相似的基于磁盘文件系统(disk-based file systems),上篇文章经过SharedPerference来进行数据存储,此次可使用File。File 对象很是适合用来读写那种流式顺序的数据,能够用来读写图片文件或者是网络中交换的数据。html
全部的Android设备都有两个文件存储区域:"internal" 与 "external" 存储。 那两个名称来自与早先的Android系统中,那个时候大多数的设备都内置了不可变的内存(internal storage),而后再加上一个相似SD card(external storage)这样能够卸载的存储部件。后来有一些设备把"internal" 与 "external" 的部分都作成不可卸载的内置存储了,虽然如此,可是这一整块仍是从逻辑上有被划分。java
Internal storage:老是可用的;这里的文件默认是只能被本身的app所访问的;当用户卸载app的时候,系统会把internal里面的相关文件都清除干净;Internal是在你想确保不被用户与其余app所访问的最佳存储区域。android
External storage:并不老是可用的,由于用户能够选择把这部分做为USB存储模式,这样就不能够访问了;是你们均可以访问的,所以保存到这里的文件是失去访问控制权限的;当用户卸载你的app时,系统仅仅会删除external根目录(getExternalFilesDir)下的相关文件;External是在你不须要严格的访问权限而且你但愿这些文件可以被其余app所共享或者是容许用户经过电脑访问时的最佳存储区域。缓存
保存到手机的internal的时候,须要两种方法去取出文件目录:网络
getFilesDir() : 返回一个File,表明app的internal目录。app
getCacheDir() : 返回一个File,表明了app的internal缓存目录。须要确保这个目录下的文件在一旦再也不须要的时候可以立刻被删除,还要分配一个合理的大小,例如1MB 。若是系统的内部存储空间不够,会自行选择删除缓存文件。this
下面这种方式直接经过openFileOutput,在对应的路径下建立一个文件:google
String filename ="testfile"; String string = "FlyElephant!"; FileOutputStream outputStream; try { outputStream = openFileOutput(filename, Context.MODE_PRIVATE); outputStream.write(string.getBytes()); outputStream.close(); } catch (Exception e) { e.printStackTrace(); }
固然若是你想保存一些缓存文件的时候,就须要调用一下系统的getCacheDir()方法:spa
File file; try { String fileName="CacheTest"; file = File.createTempFile(fileName, ".txt", MainActivity.this.getCacheDir()); } catch (IOException e) { // Error while creating file }
刚才保存到Internal中的时候什么都没有配置,须要保存到外部的时候须要配置读写的权限,读的权限READ_EXTERNAL_STORAGE,写的权限:READ_EXTERNAL_STORAGE:htm
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
先来看一段保存到外部存储的代码:
if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { File file = new File(Environment.getExternalStorageDirectory(), "66.txt"); try { FileOutputStream fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject("FlyElephant");// 写入 fos.close(); // 关闭输出流 } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Log.i("com.example.googlefile", file.getAbsolutePath());
首先须要判断一下SD卡是否是可用,由于external storage多是不可用的好比SD卡被拔出,那么你应该在访问以前去检查是否可用。你能够经过执行 getExternalStorageState()来查询external storage的状态。若是返回的状态是MEDIA_MOUNTED, 那么你能够读写。(开始没有判断的时候,一直没有找到报错的缘由)
看到这个获取完以后跟上面保存在内部存储设备的过程同样,下面就不用多说什么了,最后一点就是路径是在/mnt/sdcard目录下,若是是弄成私有文件,不容许外部访问,目录应该是在
/mnt/sdcard/Android/data/包名 目录下。
文件存储比较简单,另外说下文件删除吧,保存到外部:
file.Delete()
Internal中的删除:
MainActivity.this.deleteFile("testfile")