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

Java读取约300MB的JSON URL遇403错误及curl执行问题求解

问题与解决方案:获取MTGJSON数据的Java实现问题

问题1:HttpsURLConnection请求返回403错误

用Java原生HttpsURLConnection读取目标JSON数据时,在获取输入流环节抛出IOException,返回HTTP 403响应码。使用Java 1.8版本,开发工具为Apache NetBeans 16和Eclipse Neon3。

错误代码如下:

url = new URL("https://mtgjson.com/api/v5/AllPrintings.json");
conn = (HttpsURLConnection) url.openConnection();

BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); // 错误发生在此行

String inputLine;
StringBuffer content = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    content.append(inputLine);
}
System.out.println(content);

问题2:ProcessBuilder调用curl出现进程挂起

改用ProcessBuilder调用curl命令尝试获取数据,代码执行后curl运行约一分钟就停止,只有终止NetBeans中的程序时才会继续,无法保证完整生成文件。

对应代码:

String command = "curl --keepalive-time 5 https://mtgjson.com/api/v5/AllPrintings.json";
ProcessBuilder pb = new ProcessBuilder(command.split(" "));
pb.redirectOutput(new File("AllPrintings.json"));
Process process = pb.start();
// use while() or process.waitfor();
while(process.isAlive())
    Thread.sleep(1000);
process.destroy();

解决方案:正确配置ProcessBuilder

通过调整ProcessBuilder的IO配置并等待进程终止,可完整生成文件且程序不会挂起,核心原因是需要消费curl输出到控制台的信息。

可行代码如下:

String command = "curl https://mtgjson.com/api/v5/AllPrintings.json";
ProcessBuilder pb = new ProcessBuilder(command.split(" "));

pb.inheritIO(); // 防止程序挂起
pb.redirectOutput(new File("AllPrintings.json"));

Process process = pb.start();
process.waitFor(); // 等待进程执行完毕

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:10:46