背景: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。即未实现覆盖复制,我的目的是覆盖复制,也想过检测文件存在就删除,再复制这种板方法,但是这种办法不能满足所开发软件的需求。请问如何实现**在不删除原有文件的前提下,怎么把文件覆盖写入目标文件中**呢?
该回答引用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"),这样如果目标文件已经存在,则会被覆盖写入,否则会创建一个新文件并写入数据。这样就可以实现覆盖写入目标文件的操作了。
加载文件的时候加个if判断是否文件存在,File.exists()方法