You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断Codename One downloadUrlToFileSystemInBackground下载失败并删除残损文件

刚好对Codename One的下载机制比较熟悉,来给你详细解答这两个实际开发中常遇到的问题:

1. 判断downloadUrlToFileSystemInBackground的下载是否失败

downloadUrlToFileSystemInBackground是异步方法,它本身提供了回调机制来直接监听下载的成功与失败,这是最可靠的判断方式:

你在调用方法时,需要传入两个回调对象:

  • SuccessCallback<File>:当下载完全成功时触发,参数里的File就是完整的下载文件
  • FailureCallback<Throwable>:只要下载过程中出现任何异常(网络中断、文件写入失败、URL无效等),都会触发这个回调,Throwable参数会包含具体的失败原因

举个实际的代码示例:

String downloadUrl = "https://example.com/your-file.zip";
String saveFileName = "downloaded-file.zip";
FileSystemStorage fs = FileSystemStorage.getInstance();
String targetFilePath = fs.getAppHomePath() + saveFileName;

// 调用下载方法并传入回调
DownloadService.downloadUrlToFileSystemInBackground(downloadUrl, targetFilePath,
    // 下载成功回调
    completedFile -> {
        Log.p("下载成功!文件路径:" + completedFile.getAbsolutePath());
    },
    // 下载失败回调
    error -> {
        Log.p("下载失败,原因:" + error.getMessage());
        // 这里可以直接处理失败后的逻辑,比如删除不完整文件
    }
);

另外,如果你需要额外验证文件完整性(比如担心回调误判),可以预先获取文件的预期大小或哈希值,下载完成后对比实际文件的大小/哈希,不过这种情况属于补充验证,核心判断还是依赖回调。

2. 下载失败后删除FileStorage中的不完整文件

最直接的方式就是在下载失败的回调里执行删除操作,因为此时你已经明确知道下载失败,且持有目标文件的路径:

// 延续上面的代码,在失败回调中添加删除逻辑
error -> {
    Log.p("下载失败,原因:" + error.getMessage());
    FileSystemStorage fs = FileSystemStorage.getInstance();
    // 先检查文件是否存在,避免抛出异常
    if (fs.exists(targetFilePath)) {
        boolean isDeleted = fs.delete(targetFilePath);
        if (isDeleted) {
            Log.p("不完整文件已成功删除");
        } else {
            Log.p("删除不完整文件失败,可能是文件被占用");
        }
    }
}

如果是程序重启后才发现有遗留的不完整文件,你可以通过以下方式处理:

  1. 记录每个下载任务的预期文件大小(比如从接口获取或预先配置)
  2. 遍历FileStorage中的文件,对比实际文件大小与预期大小
  3. 如果实际大小小于预期,判定为不完整文件并删除

示例代码:

String targetFilePath = fs.getAppHomePath() + "downloaded-file.zip";
long expectedFileSize = 1024 * 1024; // 假设预期是1MB

if (fs.exists(targetFilePath)) {
    long actualSize = fs.getLength(targetFilePath);
    if (actualSize < expectedFileSize) {
        fs.delete(targetFilePath);
        Log.p("清理了遗留的不完整文件");
    }
}

内容的提问来源于stack exchange,提问作者IfeFromKolopay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:38:39