zoukankan      html  css  js  c++  java
  • Android数据存储之File

    Android使用与其他平台类似的基于磁盘文件系统(disk-based file systems),上篇文章通过SharedPerference来进行数据存储,这次可以使用File。File 对象非常适合用来读写那种流式顺序的数据,可以用来读写图片文件或者是网络中交换的数据。

    存储位置

    所有的Android设备都有两个文件存储区域:"internal" 与 "external" 存储。 那两个名称来自与早先的Android系统中,那个时候大多数的设备都内置了不可变的内存(internal storage),然后再加上一个类似SD card(external storage)这样可以卸载的存储部件。后来有一些设备把"internal" 与 "external" 的部分都做成不可卸载的内置存储了,虽然如此,但是这一整块还是从逻辑上有被划分。

    Internal storage:总是可用的;这里的文件默认是只能被自己的app所访问的;当用户卸载app的时候,系统会把internal里面的相关文件都清除干净;Internal是在你想确保不被用户与其他app所访问的最佳存储区域。

    External storage:并不总是可用的,因为用户可以选择把这部分作为USB存储模式,这样就不可以访问了;是大家都可以访问的,因此保存到这里的文件是失去访问控制权限的;当用户卸载你的app时,系统仅仅会删除external根目录(getExternalFilesDir)下的相关文件;External是在你不需要严格的访问权限并且你希望这些文件能够被其他app所共享或者是允许用户通过电脑访问时的最佳存储区域。

    Internal storage保存

    保存到手机的internal的时候,需要两种方法去取出文件目录:

    getFilesDir() : 返回一个File,代表app的internal目录。

    getCacheDir() : 返回一个File,代表了app的internal缓存目录。需要确保这个目录下的文件在一旦不再需要的时候能够马上被删除,还要分配一个合理的大小,例如1MB 。如果系统的内部存储空间不够,会自行选择删除缓存文件。

    下面这种方式直接通过openFileOutput,在对应的路径下创建一个文件:

    	 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()方法:

    	 File file;
    		 try {
    		 String fileName="CacheTest";
    		 file = File.createTempFile(fileName, ".txt",
    		 MainActivity.this.getCacheDir());
    		 }
    		 catch (IOException e) {
    		 // Error while creating file
    		 }
    

    External storage保存

    刚才保存到Internal中的时候什么都没有配置,需要保存到外部的时候需要配置读写的权限,读的权限READ_EXTERNAL_STORAGE,写的权限:READ_EXTERNAL_STORAGE:

        <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")
  • 相关阅读:
    堆栈学习
    需要阅读的书籍
    Rust Book Lang Ch.19 Fully Qualified Syntax, Supertraits, Newtype Pattern, type aliases, never type, dynamic sized type
    Rust Lang Book Ch.19 Placeholder type, Default generic type parameter, operator overloading
    Rust Lang Book Ch.19 Unsafe
    Rust Lang Book Ch.18 Patterns and Matching
    Rust Lang Book Ch.17 OOP
    Rust Lang Book Ch.16 Concurrency
    Rust Lang Book Ch.15 Smart Pointers
    HDU3966-Aragorn's Story-树链剖分-点权
  • 原文地址:https://www.cnblogs.com/xiaofeixiang/p/4047340.html
Copyright © 2011-2022 走看看