Java实现提取重复书名输出到文件 代码无法打印重复内容问题求助
问题根因
- 输入文件配置错误:要求读取的是
Samsbooks.txt文本文件,你的代码里填的是C:\Users\patti\Desktop\Patricks dcom101class\CSIT 210\SamsBookstore.txt.docx,这是Word格式文件无法按行读取书名,同时Windows文件路径的反斜杠需要转义为\\否则会触发编译错误。 - 核心逻辑倒置:你当前的逻辑是判断书名不在输出文件就写入,最终输出的是所有不重复的书名,和要求的「输出重复出现的书名」完全相反。
- 缓冲区未刷新问题:PrintWriter默认开启内存缓冲,你在循环中边写边读输出文件时,写入的内容还在内存没有落盘,读取操作拿不到最新写入的数据。
- 控制台输出逻辑缺失:你最后只打印了固定表头,没有读取最终生成的输出文件内容打印到控制台。
修正后代码(无HashMap/集合类,符合学习进度要求)
import java.io.*; public class bookstore { public static void main(String[] args) throws IOException { // 配置正确的输入输出路径,注意反斜杠转义 String inputPath = "C:\\Users\\patti\\Desktop\\Patricks dcom101class\\CSIT 210\\Samsbooks.txt"; String outputPath = "SamsDuplicate.txt"; PrintWriter duplicatesWriter = new PrintWriter(outputPath); // 写入固定表头 duplicatesWriter.println("Duplicate Books"); duplicatesWriter.println("Sam’s Bookstore 2021"); duplicatesWriter.println(); String currentBook = null; BufferedReader originalReader = new BufferedReader(new FileReader(inputPath)); // 遍历原文件每一本书名 while ((currentBook = originalReader.readLine()) != null) { // 跳过空行 if (currentBook.trim().isEmpty()) { continue; } // 先检查这本书是不是已经写入过输出文件了,避免重复输出同一个重复书名 boolean alreadyWritten = false; BufferedReader outputReader = new BufferedReader(new FileReader(outputPath)); String existLine = null; while ((existLine = outputReader.readLine()) != null) { if (currentBook.equals(existLine)) { alreadyWritten = true; break; } } outputReader.close(); if (alreadyWritten) { continue; } // 统计当前书名在原文件中出现的总次数 int count = 0; BufferedReader countReader = new BufferedReader(new FileReader(inputPath)); String countLine = null; while ((countLine = countReader.readLine()) != null) { if (currentBook.equals(countLine)) { count++; } } countReader.close(); // 出现次数大于1就是重复书名,写入输出文件 if (count > 1) { duplicatesWriter.println(currentBook); duplicatesWriter.flush(); // 立即刷入磁盘,方便后续读取判断 } } // 关闭资源 originalReader.close(); duplicatesWriter.close(); // 读取输出文件内容打印到控制台 BufferedReader resultReader = new BufferedReader(new FileReader(outputPath)); String line = null; while ((line = resultReader.readLine()) != null) { System.out.println(line); } resultReader.close(); } }
注意事项
- 请把代码里的
inputPath替换为你实际存放Samsbooks.txt的正确路径 - 执行代码前确保
Samsbooks.txt是纯文本格式,每行存放一个书名
内容的提问来源于stack exchange,提问作者Patrick O'Rourke
相关产品推荐
相关产品推荐

