LinkedList读写TXT文件异常:读取内容与写入不一致问题咨询
遇到这种子列表读写后大小不一致的情况,多半是分割逻辑、文件读写的格式/流处理这两个环节出了问题,咱们一步步拆解排查:
一、先确认分割逻辑是否正确
首先得保证分割后的子列表在写入文件前就是正确大小的,别还没写入就错了。
比如原始列表大小是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

