Java读取文本文件时如何保留换行符以适配霍夫曼编码需求?
问题根源
你遇到的问题是BufferedReader.readLine()方法的设计特性导致的:该方法会读取一行内容直到遇到换行符(\n)、回车符(\r)或者回车+换行的组合,返回的内容不包含这些行尾符,所以直接拼接返回值自然会丢失所有换行信息,你的推测是正确的,仅靠该方法的原生返回值无法满足保留换行的需求。
解决方案
方案1:基于原有逐行读取逻辑修改,手动补加换行
适用场景:不需要严格对齐原文件的换行格式(比如原文件用Windows的\r\n换行,你统一替换为\n也不影响使用),且可以接受文件最后一行额外多一个换行的情况。
该方案同时优化了原有逻辑的两个问题:一是用StringBuilder替代String直接拼接,避免频繁创建新字符串对象,大幅提升大文件读取性能;二是使用try-with-resources语法自动释放流资源,避免资源泄漏。
private String readFile(String filename) { StringBuilder toReturn = new StringBuilder(); String curLine; try (BufferedReader reader = new BufferedReader(new FileReader(filename))) { while ((curLine = reader.readLine()) != null) { toReturn.append(curLine).append("\n"); } } catch (IOException e) { e.printStackTrace(); } return toReturn.toString(); }
方案2(更推荐):直接读取全部字符,完全保留原始文件内容
霍夫曼编码需要严格和原文件字符序列一致,必须保留原换行格式、最后一行无换行等所有细节,这种情况建议放弃逐行读取的逻辑,直接读取所有字符。
如果使用JDK 11及以上版本,可用Files.readString极简实现:
import java.nio.file.Files; import java.nio.file.Paths; import java.nio.charset.StandardCharsets; private String readFile(String filename) throws IOException { // 可按需指定编码,比如StandardCharsets.UTF_8 return Files.readString(Paths.get(filename), StandardCharsets.UTF_8); }
如果使用低于JDK 11的版本,可用BufferedReader.read(char[])批量读取:
import java.nio.charset.StandardCharsets; private String readFile(String filename) { StringBuilder toReturn = new StringBuilder(); char[] buffer = new char[1024]; int len; // 显式指定编码避免乱码 try (BufferedReader reader = new BufferedReader(new FileReader(filename, StandardCharsets.UTF_8))) { while ((len = reader.read(buffer)) != -1) { toReturn.append(buffer, 0, len); } } catch (IOException e) { e.printStackTrace(); } return toReturn.toString(); }
该方案会读取文件中的所有字符,包括换行、回车、制表符等所有特殊控制符,完全不会修改原文件的内容,不会因为换行符的问题影响霍夫曼树的构建。
内容的提问来源于stack exchange,提问作者WeekendJedi
相关产品推荐
相关产品推荐

