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

无法删除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:45:26