如何等待JSON文件生成就绪后再执行转Excel的操作?
如何等待JSON文件生成就绪后再执行转Excel的操作?
嘿,我来帮你搞定这个问题!你现在的代码直接去读取JSON文件,但如果其他生成文件的方法还没跑完,文件要么不存在,要么内容不完整,肯定会导致转换失败对吧?咱们可以给代码加一段等待文件就绪的逻辑,确保文件完全生成好之后再执行Excel转换。
下面是修改后的完整代码,我会把新增的部分标出来,你一看就懂:
public class converter2_ES { @Test public void main() throws Exception { String jsonFilePath = ".//json_files//elastic_search.json"; // 新增:等待文件就绪,这里设置超时10分钟,每2秒检查一次 waitForFileReady(jsonFilePath, 10 * 60 * 1000, 2000); LocalDateTime date = LocalDateTime.now(); DateTimeFormatter dateformat = DateTimeFormatter.ofPattern("dd-MM-yyyy HH-mm-ss"); String formatedate = date.format(dateformat); Workbook workbook = new Workbook(jsonFilePath); workbook.save(".//Excel_files//es_files//ES-" + formatedate + ".xlsx"); System.out.println("Elastic_search json file converted successfully"); } // 新增:专门用来等待文件就绪的工具方法 private void waitForFileReady(String filePath, long timeoutMillis, long checkIntervalMillis) throws InterruptedException { File jsonFile = new File(filePath); long startTime = System.currentTimeMillis(); while (true) { // 第一步:检查文件是否存在且不为空 if (jsonFile.exists() && jsonFile.length() > 0) { // 第二步:确认文件内容已经写完(大小不再变化) Thread.sleep(500); File checkFile = new File(filePath); if (checkFile.length() == jsonFile.length()) { System.out.println("JSON文件已就绪,开始转换..."); break; } // 如果大小变了,更新文件对象继续等 jsonFile = checkFile; } // 第三步:防止无限等待,超时就抛出异常 if (System.currentTimeMillis() - startTime > timeoutMillis) { throw new RuntimeException("等待JSON文件就绪超时啦!路径:" + filePath); } // 每隔一段时间检查一次,别太频繁占用资源 Thread.sleep(checkIntervalMillis); } } }
我再给你拆解下这段逻辑的核心点:
- 双重确认文件完整性:不光检查文件存在,还要等文件大小稳定——毕竟有时候文件创建了,但其他进程还在往里面写数据,这时候读会拿到不完整的JSON,肯定转失败。
- 超时保护:设置了10分钟的超时时间(你可以根据实际情况调整),要是超过这个时间文件还没好,直接抛异常,方便你排查是生成文件的方法出问题了还是其他原因。
- 合理的检查间隔:每2秒检查一次,既不会太频繁浪费CPU,也不会错过文件生成的时机。
你可以根据自己的实际需求调整超时时间和检查间隔,比如如果生成文件很快,就把间隔调短一点,超时时间也可以设得小一些~
备注:内容来源于stack exchange,提问作者Ramesh
相关产品推荐
相关产品推荐

