android学习笔记(6)

保存内容到文件

  • 保存到内部存储(Internal Storage)
  • 保存到外部存储(External Storage)

内部与外部存储比较

内部存储 外部存储
总是可用 当用户挂载外部存储(SD卡)时可用,卸载后无法使用
保存的文件只能被当前应用访问 其他应用可以访问
用户卸载应用后,内部存储保存的文件会被全部删除 用户卸载应用后,系统将会删除通过
getExternalFilesDir()创建的目录

保存文件到内部存储

  • getFilesDir()返回应用内部存储根目录
  • getCacheDir()返回应用内部存储缓存目录
  • 创建文件
File file = new File(context.getFilesDir(), filename);
  • 通过openFileOutput或者FileOutputStream
String filename = "myfile";  
String string = "Hello world!";
FileOutputStream outputStream;
try {
    outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
    outputStream.write(string.getBytes());
    outputStream.close();
} catch (Exception e) {
    e.printStackTrace();
}
  • 创建缓存文件
public File getTempFile(Context context, String url) {
    File file;
    try {
        String fileName = Uri.parse(url).getLastPathSegment();
        file = File.createTempFile(fileName, null, context.getCacheDir());
    catch (IOException e) {
        // Error while creating file
    }
    return file;
}

保存文件到外部存储

  • 获取外部存储状态
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
      String state = Environment.getExternalStorageState();
      if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
      }
      return false;
} 
/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
      String state = Environment.getExternalStorageState();
      if (Environment.MEDIA_MOUNTED.equals(state) ||Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
          return true;
      }
      return false;
}
  • 尽管external storage对于用户与其他app是可以修改的,但有2类文件可以保存在external storage中:
    • <strong>Public files</strong>这些文件对与用户与其他app来说是public的,当用户卸载你的app时,这些文件应该保留。例如,那些被你的app拍摄的图片或者下载的文件。
    • <strong>Private files</strong>对其他app无意义的,当用户卸载你的app时,系统会删除你的app的private目录。例如,那些被你的app下载的缓存文件。
  • 如果你想要保存文件为public形式的,用getExternalStoragePublicDirectory()方法来获取一个 File 对象来表示存储在external storage的目录。
public File getAlbumStorageDir(String albumName) {
    // Get the directory for the user's public pictures directory.
      File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), albumName);
      if (!file.mkdirs()) {
        Log.e(LOG_TAG, "Directory not created");
      }
      return file;
} ```

 * 如果你想要保存文件为私有的方式,你可以通过执行[getExternalFilesDir()](http://developer.android.com/reference/android/content/Context.html#getExternalFilesDir(java.lang.String)) 来获取相应的目录,并且传递一个指示文件类型的参数。

public File getAlbumStorageDir(Context context, String albumName) {
// Get the directory for the app's private pictures directory.
File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES),albumName);
if (!file.mkdirs()) {
Log.e(LOG_TAG, "Directory not created");
}
return file;
}


### 查询剩余空间
 * 通过执行[getFreeSpace()](http://developer.android.com/reference/java/io/File.html#getFreeSpace()) or [getTotalSpace()](http://developer.android.com/reference/java/io/File.html#getTotalSpace()) 来判断是否有足够的空间来保存文件,从而避免发生[IOException](http://developer.android.com/reference/java/io/IOException.html)。

### 删除文件
 * 删除文件```myFile.delete()```
 * 如果文件是保存在internal storage,你可以通过Context来访问并通过执行deleteFile()进行删除```myContext.deleteFile(fileName);```
 > 当用户卸载你的app时,android系统会删除以下文件:<br>
所有保存到internal storage的文件。
所有使用getExternalFilesDir()方式保存在external storage的文件。
然而,通常来说,你应该手动删除所有通过 getCacheDir() 方式创建的缓存文件,以及那些不会再用到的文件。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,868评论 18 139
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,508评论 0 17
  • 作者:刘朋 链接:https://www.zhihu.com/question/19866689/answer/1...
    十七的样子阅读 785评论 0 0
  • 归读,是梅州城区一个集生态、文化、休闲于一体的综合性河滨公园,是梅州城区园林绿化和公用设施的一张出色名片,...
    漫步归读阅读 492评论 0 1
  • 日常提交代码 方案1: 添加代码到暂存区 提交代码(本地提交) 抓取远程分支到本地(相当于在本地提交前拉取远程代码...
    McsNick阅读 121评论 0 0