You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

从Dropbox下载84M压缩包完成后变为0字节,请问问题出在哪?

解决Dropbox下载后文件变为0字节的问题

嘿,我来帮你捋捋这个问题!从你描述的情况和给出的代码片段来看,最可能的问题出在IO流的处理不规范上,还有可能忽略了Dropbox链接的重定向逻辑,我给你拆解下:

常见问题点

  • 流未正确关闭/刷新:Java的FileOutputStream会把数据临时存在内存缓冲区里,要是你没调用flush()或者close(),缓冲区的内容根本不会写入磁盘。如果下载过程中程序意外终止,或者代码里没执行到关闭流的步骤,最后就会留下0字节的空文件。
  • 异常未捕获处理:下载过程中很容易出现IO异常(比如网络波动、Dropbox返回错误),要是你的代码没加异常捕获,程序直接崩溃,流就没法正常关闭,之前写入的内容也可能被截断,导致文件无效。
  • Dropbox链接重定向:虽然你加了dl=1参数(这个是对的,用来触发直接下载),但Dropbox有时候会返回3xx重定向,要是代码没处理重定向,可能实际没拿到真实的文件数据。不过你说下载时文件大小正常增长,这个可能性相对低,但也不能完全排除。

修正后的代码示例

public static void downloadDropBox(File file) {
    String url = "https://www.dropbox.com/sh/jx4b2wvqg8d4ze1/AAA0J3LztkRc6FJ5tKy4dUKha?dl=1";
    int bytesRead;
    byte[] bytesArray = new byte[1024];
    InputStream is = null;
    FileOutputStream outputStream = null;

    try {
        URL dropboxUrl = new URL(url);
        // 处理Dropbox的重定向逻辑
        HttpURLConnection conn = (HttpURLConnection) dropboxUrl.openConnection();
        conn.setInstanceFollowRedirects(true);
        conn.connect();
        is = conn.getInputStream();
        outputStream = new FileOutputStream(file);

        // 循环读取并写入数据
        while ((bytesRead = is.read(bytesArray)) != -1) {
            outputStream.write(bytesArray, 0, bytesRead);
        }
        // 强制刷新缓冲区,确保所有数据写入磁盘
        outputStream.flush();
    } catch (IOException e) {
        // 打印异常信息,方便排查具体问题
        e.printStackTrace();
        // 异常时删除损坏的空文件,避免残留无效文件
        if (file.exists()) {
            file.delete();
        }
    } finally {
        // 无论是否出现异常,都要关闭流,释放资源
        try {
            if (is != null) {
                is.close();
            }
            if (outputStream != null) {
                outputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

关键修正说明

  1. 添加try-catch-finally块:保证流在任何情况下都会被关闭,同时捕获异常能帮你快速定位下载失败的原因。
  2. 处理重定向:开启InstanceFollowRedirects让HttpURLConnection自动处理Dropbox的重定向,确保拿到真实的文件流。
  3. 明确flush和close:下载完成后手动刷新缓冲区,再关闭流,确保所有数据都写入磁盘。
  4. 异常时清理无效文件:避免出现下载失败后留下0字节的垃圾文件。

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

火山引擎 最新活动