手机内部存储目录间文件复制报错:NoClassDefFoundError找不到Paths类
解决Android中复制文件时的
NoClassDefFoundError: Ljava/nio/file/Paths;问题 这个错误的核心原因很明确:java.nio.file.Paths和Files.copy()是从Android API 26(Android 8.0)才正式加入系统API的,如果你的应用设置的最低兼容版本(minSdkVersion)低于26,运行在低版本设备上时就会找不到这个类,抛出你看到的异常。
下面给你几个不同场景下的解决方案:
方案一:兼容所有Android版本的传统IO实现
如果你需要支持API 26以下的设备,推荐用传统的FileInputStream和FileOutputStream来实现文件复制,这是最稳妥的方式:
public static void copyFile(File sourceFile, File destFile) throws IOException { // 如果目标文件存在,先删除(对应你原来的REPLACE_EXISTING选项) if (destFile.exists()) { destFile.delete(); } try (FileInputStream in = new FileInputStream(sourceFile); FileOutputStream out = new FileOutputStream(destFile)) { byte[] buffer = new byte[1024 * 4]; // 4KB缓冲区,可根据需求调整 int length; while ((length = in.read(buffer)) > 0) { out.write(buffer, 0, length); } // 确保所有数据都写入磁盘 out.flush(); } }
调用的时候直接传你的file2(源文件)和file(目标文件)即可:
try { copyFile(file2, file); } catch (IOException e) { e.printStackTrace(); // 处理复制失败的情况,比如提示用户 }
方案二:仅支持API 26及以上设备
如果你的应用不需要兼容老设备,只需要两步调整:
- 在你的
build.gradle(Module级别)中把minSdkVersion设置为26:
android { defaultConfig { minSdkVersion 26 // 其他配置... } }
- 确保你已申请必要的存储权限:
- Android 6.0(API 23)及以上需要动态申请
READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限; - Android 13(API 33)及以上可以使用更细粒度的权限,比如
READ_MEDIA_IMAGES、READ_MEDIA_VIDEO等,具体根据你操作的文件类型而定; - 如果是操作应用私有目录(比如
getFilesDir()、getCacheDir()下的文件),则不需要申请权限。
- Android 6.0(API 23)及以上需要动态申请
调整后你原来的代码就可以正常运行,但记得捕获IOException:
try { Files.copy(Paths.get(file2.getAbsolutePath()), Paths.get(file.getAbsolutePath()), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { e.printStackTrace(); // 处理复制失败逻辑 }
额外提醒:关于文件移动操作
如果你需要实现文件移动,而不是复制:
- 用传统IO的话,复制完成后删除源文件即可;
- API 26+可以直接用
Files.move()方法,参数和copy()类似,同样支持REPLACE_EXISTING选项。
内容的提问来源于stack exchange,提问作者Chuflitas
相关产品推荐
相关产品推荐

