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

