如何实现重复下载同一文件时不覆盖而是生成新文件(使用PendingIntent.FLAG_UPDATE_CURRENT)
实现重复下载时创建新文件而非覆盖的方案
你的核心问题在于文件创建逻辑:当前代码直接使用传入的name生成文件,当文件已存在时FileOutputStream会默认覆盖原有内容。PendingIntent.FLAG_UPDATE_CURRENT标记和文件覆盖行为无关,它仅用于更新PendingIntent中的额外数据,不需要修改这个标记。
要实现重复下载保留多份文件,只需添加唯一文件名生成逻辑,当目标文件存在时,自动生成带序号的新文件名(如test.pdf→test(1).pdf→test(2).pdf)。以下是修改后的完整代码:
private String createPdf(String name, String pdfBase64) { byte[] pdfBytesData = Base64.decode(pdfBase64, Base64.DEFAULT); // 生成唯一文件名 File downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File targetFile = generateUniqueFileName(downloadDir, name); // 使用try-with-resources自动关闭流,避免资源泄漏 try (FileOutputStream fileOutputStream = new FileOutputStream(targetFile)) { fileOutputStream.write(pdfBytesData); fileOutputStream.flush(); return targetFile.getPath(); } catch (IOException e) { e.printStackTrace(); return null; } } // 生成不重复的文件名 private File generateUniqueFileName(File directory, String originalName) { // 拆分文件名和扩展名 String fileName = originalName; String extension = ""; int dotIndex = originalName.lastIndexOf('.'); if (dotIndex != -1) { fileName = originalName.substring(0, dotIndex); extension = originalName.substring(dotIndex); } File file = new File(directory, originalName); int counter = 1; // 循环检查文件是否存在,直到找到可用的文件名 while (file.exists()) { String newName = fileName + "(" + counter + ")" + extension; file = new File(directory, newName); counter++; } return file; }
代码关键点说明:
generateUniqueFileName方法:负责拆分原文件名的主体和扩展名,循环检查文件是否存在,若存在则追加递增序号,直到生成一个不存在的文件名。- try-with-resources语法:替代原来的手动流关闭,确保文件流无论是否异常都会被正确关闭,避免资源泄漏。
- 完全保留原有文件写入逻辑,仅修改了文件对象的生成方式,不影响原有功能的同时解决了覆盖问题。
内容的提问来源于stack exchange,提问作者Gish
相关产品推荐
相关产品推荐

