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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:06:08