新手-99 2023-03-01 11:42 采纳率: 79.3%
浏览 35
已结题

java Io流,写入的文件自动重命名

背景:android studio开发工具,目标平台为 32,即安卓11,从普通路径复制文件到沙盒路径,已获取android/data的访问权限。

  //将要复制的文件路径转为Uri
  Uri sourceDocomentUri = pathToUri(sourceFilePath);
  //将目标路径转为Uri
  Uri targetDocumentUri = pathToUri(targetFilePath);
  //定义DocumentFile
  DocumentFile df;
  try {
          //获取要复制的文件的输入流
          InputStream in = new FileInputStream(sourceFilePath);
          //获取目标文件的输出流
          OutputStream out = context.getContentResolver().openOutputStream(targetDocumentUri);
          //开始向目标文件复制
          byte[] buf = new byte[1024];
          int len;
          while ((len = in.read(buf)) > 0) {
              out.write(buf, 0, len);
          }
          in.close();
          out.close();
      }

这一操作看起来没啥毛病,但是复制完以后,打开目标文件夹,发现在复制之前,目标就已经存在,复制之后文件名字最后加了个(1),存在两个文件:test.db 和 test(1).db。即未实现覆盖复制,我的目的是覆盖复制,也想过检测文件存在就删除,再复制这种板方法,但是这种办法不能满足所开发软件的需求。请问如何实现**在不删除原有文件的前提下,怎么把文件覆盖写入目标文件中**呢?

  • 写回答

3条回答 默认 最新

  • MarkHan_ 2023-03-01 12:46
    关注

    该回答引用GPTᴼᴾᴱᴺᴬᴵ
    在Android中,您可以使用ContentResolver的openOutputStream()方法来覆盖写入文件。这个方法的第二个参数可以指定写入模式,其中有一个选项是MODE_WRITE_ONLY,可以将写入模式设置为覆盖模式,如果目标文件已经存在,则会将其覆盖。修改您的代码如下:

    //将要复制的文件路径转为Uri
    Uri sourceDocomentUri = pathToUri(sourceFilePath);
    //将目标路径转为Uri
    Uri targetDocumentUri = pathToUri(targetFilePath);
    //定义DocumentFile
    DocumentFile df;
    try {
        //获取要复制的文件的输入流
        InputStream in = new FileInputStream(sourceFilePath);
        //获取目标文件的输出流,指定写入模式为覆盖模式
        OutputStream out = context.getContentResolver().openOutputStream(targetDocumentUri, "w");
        //开始向目标文件覆盖写入
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
        in.close();
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    
    

    在这个例子中,我们在getContentResolver().openOutputStream()方法的第二个参数中指定了写入模式为覆盖模式(即字符串"w"),这样如果目标文件已经存在,则会被覆盖写入,否则会创建一个新文件并写入数据。这样就可以实现覆盖写入目标文件的操作了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月9日
  • 已采纳回答 3月1日
  • 修改了问题 3月1日
  • 创建了问题 3月1日

悬赏问题

  • ¥30 matlab appdesigner私有函数嵌套整合
  • ¥15 给我一个openharmony跑通webrtc实现视频会议的简单demo项目,sdk为12
  • ¥15 vb6.0使用jmail接收smtp邮件并另存附件到D盘
  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
  • ¥15 关于freesurfer使用freeview可视化的问题
  • ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
  • ¥15 求SC-LIWC词典!
  • ¥20 有关esp8266连接阿里云
  • ¥15 C# 调用Bartender打印机打印
  • ¥15 我这个代码哪里有问题 acm 平台上显示错误 90%,我自己运行好像没什么问题