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

读取PDF多行内容打印正常但写入文本文件仅保留最后一行求助

问题原因

你代码里的核心问题是:每次匹配到含"Color"的行时,都会重新创建PrintStream和FileOutputStream,而FileOutputStream默认是覆盖写入模式——每一次创建都会清空文件原有内容,最后自然只剩下最后一次写入的行。

解决方案

把文件输出流的初始化移到循环外部,确保整个程序只打开一次流,所有符合条件的内容都写入同一个流中,同时通过参数控制写入模式(追加/覆盖)。

修改后的完整代码:

import java.io.FileOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;

public class PrintingOnlyLastLine {

    public static void main(String[] args) {
        boolean ColorVal;
        String my_new_str_ColorVal;
        String[] lines;

        File root = new File("<pdf file folder list>");
        File[] list = root.listFiles();

        // 将输出流移至外层,仅初始化一次
        // 第二个参数true表示追加写入,若要每次运行清空文件则去掉该参数
        try (PrintStream out = new PrintStream(new FileOutputStream("Output.txt", true))) {
            for (File f : list) {
                if (f.isDirectory()) {
                    continue; // 跳过目录,原代码中f.getAbsolutePath()无实际作用
                } else {
                    File pdffile = new File("<pdf file folder list>" + f.getName());
                    try {
                        System.out.println(f.getName());
                        PDDocument document = PDDocument.load(pdffile);
                        PDFTextStripper pdfStripper = new PDFTextStripper();
                        String text = pdfStripper.getText(document);

                        lines = text.split("\\r?\\n", -1);
                        for (String line : lines) {
                            ColorVal = line.contains("Color");
                            my_new_str_ColorVal = line.replace(".", "");

                            if (ColorVal) {
                                out.println(my_new_str_ColorVal); // 用println保证每行单独显示
                                System.out.println(my_new_str_ColorVal);
                            }
                        }
                        document.close(); // 关闭PDF文档,释放资源
                    } catch (IOException e) {
                        e.printStackTrace(); // 不要吞异常,方便排查问题
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
关键修改说明
  • 流的初始化位置:将PrintStream移到最外层try-with-resources中,确保整个程序周期内只打开一次文件流,避免重复创建导致的覆盖问题
  • 写入模式控制:FileOutputStream的第二个参数设为true时,新内容会追加到文件末尾;若需要每次运行清空原有内容,去掉该参数即可(默认覆盖模式)
  • 资源释放:新增document.close()关闭PDF文档,避免文件占用或资源泄漏
  • 格式优化:用out.println()代替out.print(),让每行内容单独占一行,和控制台输出格式一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 08:48:24