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

大JSON文件移除双引号遇内存溢出及代码异常求助

解决大JSON文件移除双引号时的空文件/磁盘占满问题

我来帮你排查下问题所在,你的代码主要有几个关键错误,导致了空文件或者磁盘被占满的情况,我们一步步拆解解决:

问题1:读写同一个文件导致的致命冲突

你当前的代码里,输入文件和输出文件是完全相同的路径:

File firstFile = new File ("C:/sqlite/db/tables/" + fileName);
// ...
writerFile = new FileWriter("C:/sqlite/db/tables/" + fileName);
  • 当你用FileWriter打开这个文件时,默认会直接清空原文件内容,后续的BufferedReader读取的就是一个空文件,自然写入的也是空内容,最终生成空文件。
  • 如果用追加模式FileWriter(path, true),你会一边读取原文件内容,一边把处理后的内容追加到同一个文件末尾,这会导致文件指针不断后移,无限重复读取新写入的内容,直到磁盘被占满。

问题2:正则表达式匹配错误

你定义的匹配双引号的字符串:

String stringQuotes = "\\\\\"";

在Java中,这个字符串最终会被解析为\"(带反斜杠的转义双引号),但你的目标是移除原始的双引号",所以这个正则根本匹配不到目标内容,替换操作相当于完全无效。

而且对于简单的字符串替换,没必要用replaceAll(它会启用正则引擎),直接用replace方法更高效——replace会替换所有匹配的普通字符串,不需要正则解析,性能更好。

优化后的解决方案

针对1GB+的大文件,我们需要保证逐行处理、读写分离、资源自动管理,下面是修复后的代码:

import java.io.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.StandardCharsets;

public class QuoteRemover {
    private static final Logger log = LoggerFactory.getLogger(QuoteRemover.class);

    public void replaceDoubleQuotes(String fileName) {
        log.debug("Start formatting {} ...", fileName);
        File inputFile = new File("C:/sqlite/db/tables/" + fileName);
        // 先写到临时文件,避免直接覆盖原文件
        File tempFile = new File("C:/sqlite/db/tables/" + fileName + ".tmp");

        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(new FileInputStream(inputFile), StandardCharsets.UTF_8));
             BufferedWriter writer = new BufferedWriter(
                     new OutputStreamWriter(new FileOutputStream(tempFile), StandardCharsets.UTF_8), 16 * 1024)) {

            String line;
            // 逐行读取处理,无需额外保存冗余变量
            while ((line = reader.readLine()) != null) {
                // 直接替换所有双引号,用replace更高效
                String processedLine = line.replace("\"", "");
                writer.write(processedLine);
                writer.newLine(); // 保留换行符,保证文件行结构与原文件一致
            }

            log.debug("Processing completed, replacing original file...");
            // 处理完成后,替换原文件
            if (inputFile.delete() && tempFile.renameTo(inputFile)) {
                log.debug("File replacement successful!");
            } else {
                log.error("Failed to replace original file, temp file remains at {}", tempFile.getAbsolutePath());
            }

        } catch (IOException e) {
            log.error("Error processing file", e);
            // 出错时删除临时文件,避免磁盘残留无用文件
            tempFile.delete();
        }
    }
}

关键优化点:

  • 读写分离:先写到临时文件,处理完成后再替换原文件,彻底避免读写同一文件的冲突。
  • 高效替换:用replace("\"", "")代替replaceAll,跳过正则引擎,速度更快,也避免了转义错误。
  • 自动资源管理:用try-with-resources语法,自动关闭流,避免资源泄漏。
  • 编码明确:指定UTF-8编码,避免不同环境下的编码乱码问题。
  • 缓冲区优化:设置16KB的缓冲区(默认是8KB),减少IO操作次数,提升大文件处理速度。
  • 异常兜底:出错时自动删除临时文件,避免磁盘残留垃圾文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 21:32:58