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
相关产品推荐
相关产品推荐

