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

Java下载工具遇NoSuchFileException及FileNotFoundException求助

解决Java下载工具中的NoSuchFileException和FileNotFoundException问题

嘿,我来帮你一步步拆解并解决你遇到的这两个问题:

第一个问题:NoSuchFileException(目标目录不存在)

  • 问题原因:Files.copy() 不会自动创建目标文件所在的父目录。如果你的C:\Users\Austin\Desktop\kccutil目录还没创建,直接执行复制操作就会抛出这个异常。
  • 解决方法:在复制文件之前,先检查并创建目标目录(包括所有层级的父目录),Java的Files.createDirectories()方法可以完美做到这点——如果目录已经存在,它不会做任何多余操作,非常安全。

第二个问题:FileNotFoundException(无法访问目标URL)

  • 问题原因:你用的BleepingComputer下载链接大概率存在重定向,或者服务器会拦截没有合法User-Agent标识的请求。直接调用URL.openStream()无法处理重定向,也不会自动添加请求头,导致服务器拒绝你的请求,进而抛出这个异常。
  • 解决方法:改用HttpURLConnection手动管理连接,开启自动重定向支持,并添加模拟浏览器的User-Agent请求头,这样就能绕过服务器的基础拦截。

修改后的完整代码(带注释)

package com.kcc;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;

public class Testing2 {
    public static String testURL;
    public static String saveDir;

    public static void main(String[] args) throws IOException {
        testURL = "https://download.bleepingcomputer.com/dl/a652734ff3304da2530acb93754c1bf7/5af5a320/windows/security/security-utilities/a/adwcleaner/AdwCleaner.exe";
        saveDir = "C:\\Users\\Austin\\Desktop\\kccutil";
        download(testURL, saveDir);
    }

    private static Path download(String sourceURL, String targetDirectory) throws IOException {
        URL url = new URL(sourceURL);
        String fileName = sourceURL.substring(sourceURL.lastIndexOf('/') + 1);
        
        // 1. 确保目标目录存在,不存在则自动创建(包括所有父目录)
        Path targetDirPath = new File(targetDirectory).toPath();
        Files.createDirectories(targetDirPath);
        
        // 用Path.resolve()拼接路径,比字符串拼接更安全,避免跨平台问题
        Path targetPath = targetDirPath.resolve(fileName);

        // 2. 手动处理HTTP连接,支持重定向和添加请求头
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setInstanceFollowRedirects(true); // 开启自动跟随重定向
        // 添加User-Agent,模拟浏览器请求,避免被服务器拦截
        connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36");
        
        // 使用try-with-resources自动关闭输入流,避免资源泄漏
        try (InputStream inputStream = connection.getInputStream()) {
            Files.copy(inputStream, targetPath, StandardCopyOption.REPLACE_EXISTING);
        } finally {
            connection.disconnect(); // 确保关闭连接
        }

        return targetPath;
    }
}

额外小建议

  • 尽量用Path.resolve()来拼接文件路径,而不是手动字符串拼接,这样能避免Windows和Linux的路径分隔符问题,也更不容易出错。
  • 如果后续遇到SSL证书相关的错误,可以检查你的Java环境是否有最新的根证书,或者单独处理SSL上下文。
  • 可以给代码添加更细致的异常捕获,比如单独处理连接超时、IO异常等,给用户更友好的错误提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:22:35