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

LinkedList读写TXT文件异常:读取内容与写入不一致问题咨询

解决LinkedList分割读写后子列表大小不符的问题

遇到这种子列表读写后大小不一致的情况,多半是分割逻辑、文件读写的格式/流处理这两个环节出了问题,咱们一步步拆解排查:

一、先确认分割逻辑是否正确

首先得保证分割后的子列表在写入文件前就是正确大小的,别还没写入就错了。

比如原始列表大小是402,理论上两个子列表应该各201个元素。你可以先在分割完后打印子列表的大小,验证这一步是否正确:

正确的分割方式(以Java为例)

LinkedList<String> dataLinkedList = new LinkedList<>();
// 假设已从TXT读取填充好数据,大小402

int halfSize = dataLinkedList.size() / 2;
// 注意:别直接用subList()返回的视图,要创建独立的LinkedList
LinkedList<String> subList1 = new LinkedList<>(dataLinkedList.subList(0, halfSize));
LinkedList<String> subList2 = new LinkedList<>(dataLinkedList.subList(halfSize, dataLinkedList.size()));

// 验证分割后的大小
System.out.println("分割后子列表1大小:" + subList1.size()); // 应该输出201
System.out.println("分割后子列表2大小:" + subList2.size()); // 应该输出201

如果这一步大小不对,那就是分割逻辑的问题:比如用了错误的索引范围,或者遍历LinkedList时计数出错(比如用for循环按索引遍历LinkedList,虽然能行,但效率低且容易踩边界坑,优先用subList+新列表的方式)。

二、检查文件读写的格式与流处理

如果分割后的子列表大小是对的,但读取后变了,那就是读写文件时出了问题,常见的坑有这几个:

1. 元素分隔符选择不当

如果你的数据元素本身包含换行、空格这类字符,用换行符作为分隔符会导致读取时把一个元素拆成多个,或者多个元素合并成一个。

推荐的文本读写方式(每行存一个元素)

这种方式简单直观,只要元素本身不包含换行就没问题:

// 写入子列表到文件(用try-with-resources自动关闭流,避免数据丢失)
try (BufferedWriter writer = new BufferedWriter(new FileWriter("sub1.txt"))) {
    for (String element : subList1) {
        writer.write(element);
        writer.newLine(); // 每个元素单独占一行
    }
} catch (IOException e) {
    e.printStackTrace();
}

// 读取文件还原子列表
LinkedList<String> readSub1 = new LinkedList<>();
try (BufferedReader reader = new BufferedReader(new FileReader("sub1.txt"))) {
    String line;
    while ((line = reader.readLine()) != null) {
        // 如果允许空元素,就直接添加;否则加判断:if (!line.isEmpty())
        readSub1.add(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

2. 流未正确关闭/刷新

如果没有关闭BufferedWriter,缓冲区里的最后一批数据可能没写入文件,导致读取时少了几个元素。一定要用try-with-resources(Java 7+支持)自动管理流,或者手动调用writer.flush()和writer.close()。

3. 元素包含特殊字符?用序列化解决

如果你的数据元素本身就有换行、自定义分隔符这类内容,文本格式就不太靠谱了,直接用对象序列化来保存LinkedList的完整结构:

// 序列化写入子列表
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("sub1.ser"))) {
    oos.writeObject(subList1);
} catch (IOException e) {
    e.printStackTrace();
}

// 序列化读取子列表
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("sub1.ser"))) {
    LinkedList<String> readSub1 = (LinkedList<String>) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
    e.printStackTrace();
}

这种方式会把LinkedList完整序列化到二进制文件,完全不会出现元素解析错误的问题,缺点是文件不可读。

三、最后验证合并结果

读取完两个子列表后,合并并验证大小:

LinkedList<String> restoredList = new LinkedList<>(readSub1);
restoredList.addAll(readSub2);
System.out.println("还原后的列表大小:" + restoredList.size()); // 应该输出402

按照这个流程排查,基本就能解决大小不符的问题啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:01:18