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

