无法删除JSON文件,提示‘文件正被其他进程占用’求技术解决
问题解决:JSON文件被占用无法删除
问题根源
你遇到的FileSystemException是因为**FileReader未被关闭**,导致文件句柄一直被占用,操作系统不允许删除正在被使用的文件。代码中parser.parse(new FileReader(".//Json_files//db-" + stockname + ".json"))这一行创建了FileReader但没有显式关闭,资源未释放。
修复方案
使用try-with-resources语法(Java 7+支持)自动关闭FileReader,它会在代码块结束后自动释放资源,无需手动调用close()。
修改后的关键代码段
JSONParser parser = new JSONParser(); // 使用try-with-resources自动关闭FileReader try (FileReader reader = new FileReader(".//Json_files//db-" + stockname + ".json")) { Object obj = parser.parse(reader); JSONObject jsonObj = (JSONObject) obj; JSONObject response = (JSONObject) jsonObj.get("response"); JSONObject arraybody = (JSONObject) response.get("data"); JSONArray arrayindex = (JSONArray) arraybody.get("arrayRowData"); // 后续解析逻辑保持不变... }
完整修改后的核心代码片段
// ... 前面代码不变 ... PrintWriter out = new PrintWriter(new FileWriter(".//Json_files//db-" + stockname + ".json", true), true); out.write(resp.asString()); out.close(); JSONParser parser = new JSONParser(); // 核心修改:用try-with-resources包裹FileReader try (FileReader reader = new FileReader(".//Json_files//db-" + stockname + ".json")) { Object obj = parser.parse(reader); JSONObject jsonObj = (JSONObject) obj; JSONObject response = (JSONObject) jsonObj.get("response"); JSONObject arraybody = (JSONObject) response.get("data"); JSONArray arrayindex = (JSONArray) arraybody.get("arrayRowData"); int n = arrayindex.size(); s = wb.createSheet(stockname); for (int j = 0; j < n; j++) { JSONObject jsonObject = new JSONObject((Map) arrayindex.get(j)); JSONObject jsonObject1 = (JSONObject) jsonObject.get("header"); String value = (String) jsonObject1.get("displayName"); s.createRow(j + 1).createCell(0).setCellValue(value); JSONArray arrayindex1 = (JSONArray) jsonObject.get("cellData"); int m = arrayindex1.size(); int x = m - 1; r = s.getRow(j + 1); r1 = s.createRow(0); for (int k = 0; k <= x; k++) { JSONObject jsonObject12 = new JSONObject((Map) arrayindex1.get(k)); String newdate = (String) jsonObject12.get("fiscalDate"); r1.createCell(k + 1).setCellValue(newdate); if (jsonObject12.get("value") == null) { r.createCell(k + 1).setCellValue("-"); } else { r.createCell(k + 1).setCellValue((double) jsonObject12.get("value")); } } } } fo = new FileOutputStream(dir + "//DB_Search" + "-" + formatedate + ".xlsx"); wb.write(fo); fo.flush(); fo.close(); try { Files.deleteIfExists(Paths.get(".//Json_files//db-" + stockname + ".json")); } catch (NoSuchFileException e) { System.out.println("No such file/directory exists"); } catch (DirectoryNotEmptyException e) { System.out.println("Directory is not empty."); } // ... 后面代码不变 ...
额外建议
- 所有实现
AutoCloseable接口的资源(比如FileReader、FileWriter、FileOutputStream等)都建议用try-with-resources管理,避免手动关闭遗漏导致的资源泄漏。 - 你代码中的
PrintWriter和FileOutputStream虽然手动调用了close(),但换成try-with-resources会更安全,比如:try (PrintWriter out = new PrintWriter(new FileWriter(".//Json_files//db-" + stockname + ".json", true), true)) { out.write(resp.asString()); }
内容的提问来源于stack exchange,提问作者ramesh
相关产品推荐
相关产品推荐

