返回介绍

开始写入 startWrite

发布于 2024-12-23 22:15:04 字数 1336 浏览 0 评论 0 收藏 0

在获取向文件写入的输出流之前,它会对原文件进行备份,同时清除原文件内容。

同时根据其原理可知,它并不是线程安全的,如果需要多线程操作等,最好自己加锁,如果一个线程未写完,直接开启了另一个线程进行写入可能会导致文件内容丢失。

另外使用这种方法获得到的 FileOutputStream 不要直接关闭,写入完成的时候需要调用 finishWrite 或者 failWrite 进行关闭,否则下次读取的时候会因为备份文件存在而使本次写入失效。

public FileOutputStream startWrite() throws IOException {
  // 当原文件存在,备份文件不存在的时候,原文件更名为备份文件
  if (mBaseName.exists()) {
    if (!mBackupName.exists()) {
      	// 如果原文件存在且备份文件不存在,直接将原文件重命名为备份文件
      if (!mBaseName.renameTo(mBackupName)) {
        Log.w("AtomicFile", "Couldn't rename file " + mBaseName
            + " to backup file " + mBackupName);
      }
    } else {
      mBaseName.delete();	// 删除原文件
    }
  }
  	// 保证原文件存在,并根据原文件创建一个输出流。
  FileOutputStream str = null;
  try {
    str = new FileOutputStream(mBaseName);
  } catch (FileNotFoundException e) {
    File parent = mBaseName.getParentFile();
    if (!parent.mkdirs()) {
      throw new IOException("Couldn't create directory " + mBaseName);
    }
    FileUtils.setPermissions(
      parent.getPath(),
      FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
      -1, -1);
    try {
      str = new FileOutputStream(mBaseName);
    } catch (FileNotFoundException e2) {
      throw new IOException("Couldn't create " + mBaseName);
    }
  }
  return str;	// 返回输出流。
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文