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
相关产品推荐
相关产品推荐

