JavaFX TableView读取文件数据显示 如何处理用户输入的换行符问题
解决方案
核心问题是你当前用换行符同时作为字段分隔符和用户输入的内容字符,导致边界识别混乱。只需要把字段分隔逻辑和用户输入内容做隔离即可,以下是改造成本最低的实现方案:
方案1:转义用户输入中的换行符(推荐)
通过自定义转义规则,把用户输入内容里的换行符和作为分隔符的换行符区分开,代码改动量最小,完全兼容原有逻辑。
步骤1:新增转义/反转义工具方法
// 写入前转义内容 private String escape(String content) { // 先转义百分号避免用户输入的%0A被误识别 return content.replace("%", "%25") .replace("\n", "%0A"); } // 读取后反转义内容 private String unescape(String content) { return content.replace("%0A", "\n") .replace("%25", "%"); }
步骤2:修改写入逻辑
写入每个字段前先做转义:
StringBuilder stringBuilder = new StringBuilder(); // 你的arrList如果还是二维数组,就给每个子元素都做escape处理即可 for (Value value : arrList) { stringBuilder.append(escape(value.getName())).append("\n"); stringBuilder.append(escape(value.getDate())).append("\n"); stringBuilder.append(escape(value.getAdditionalInfo())).append("\n"); }
步骤3:修改读取逻辑
读取每一行后先做反转义:
while(sc.hasNextLine()){ String name = unescape(sc.nextLine()); String date = unescape(sc.nextLine()); String info = unescape(sc.nextLine()); Value value = new Value(name, date, info); tableView.getItems().add(value); storeValue(); }
其他可选方案
方案2:增加字段长度前缀
写入每个字段前先标记该字段的字符长度,格式为[长度]|[内容],示例存储格式:
12|John Overflow 10|12.02.2021 25|YAY! I'm stuck! Please Help me!
读取时先按|分割拿到长度,再读取对应长度的内容即可,完全不受用户输入的特殊字符影响,适合数据严谨性要求高的场景。
方案3:使用结构化存储格式
直接将数据序列化为JSON、CSV等标准结构化格式存储,无需自行处理分隔符逻辑,适合后续功能扩展的场景,需要引入对应的序列化库。
原有代码优化建议
- 文件写入操作建议用
try-with-resources语法自动关闭流,避免手动关闭遗漏导致的资源泄漏 - 每次更新文件先删除原文件的逻辑存在数据丢失风险,可先写入临时文件,写入完成后再替换原文件,避免写入过程中程序崩溃导致数据全量丢失
内容的提问来源于stack exchange,提问作者Vmir
相关产品推荐
相关产品推荐

