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

Java递归打印星号圣诞树写入文件无输出问题求助

代码问题分析

  • 递归过程重复创建PrintWriter导致文件内容被覆盖:你在printChristmasTree方法内部每次递归调用都新建一个指向Out0103.txt的PrintWriter实例,该类的默认构造器会清空原有文件内容,前序递归写入的内容都会被后续新建的PrintWriter覆盖,最终只会保留最后一次调用写入的内容,甚至完全无内容。
  • 未主动关闭/刷新PrintWriter导致缓冲区内容未写入磁盘:Java的PrintWriter默认带有缓冲区,若没有主动调用flush()或者close()方法,写入的内容会留在缓冲区中不会真正落盘,程序退出后缓冲区内容直接丢失,自然输出文件为空。
  • 空格和星号分两行输出存在格式错误:当前代码把左侧空格、星号分别用println输出,会导致空格单独占一行、星号单独占一行,无法拼出居中的圣诞树形状,需要把二者拼接成同一行再输出。

修正后的参考代码

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class ChristmasTree {
    public static void main(String[] args) throws FileNotFoundException {
        File file = new File("In0103.txt");
        Scanner in = new Scanner(file);
        int maxWidth = in.nextInt();
        in.close();
        int initialWidth = 1;
        int initialLevel = 1;
        int maxLevel = (maxWidth + 1) / 2;
        int freeSpace = maxLevel - 1;
        // PrintWriter移到外部创建,避免重复覆盖文件
        try (PrintWriter save = new PrintWriter("Out0103.txt")) {
            printChristmasTree(initialWidth, initialLevel, maxLevel, freeSpace, save);
        } // try-with-resources语法会自动关闭PrintWriter,自动刷新缓冲区落盘
    }

    static void printChristmasTree(int width, int level, int maxLevel, int freeSpace, PrintWriter save) {
        // 空格和星号拼接为同一行输出
        String line = Stream.generate(() -> " ").limit(freeSpace).collect(Collectors.joining())
                + Stream.generate(() -> "*").limit(width).collect(Collectors.joining());
        save.println(line);
        if (level < maxLevel) {
            printChristmasTree(width + 2, level + 1, maxLevel, freeSpace - 1, save);
        }
    }
}

内容的提问来源于stack exchange,提问作者Rafał Masny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:06:01