在Java中向文本文件写入多行

3
以下代码是在cmd中运行一个命令,并生成一个包含命令行输出的文本文件。下面的代码在Eclipse的输出窗口中显示正确信息,但只有最后一行被打印到文本文件中。有人可以帮我解决吗?
import java.io.*;

public class TextFile {
public static void main(String[] args) throws IOException {
    try {
        Process p = Runtime.getRuntime().exec("git log");

        BufferedReader in = new BufferedReader(
                new InputStreamReader(p.getInputStream()));
        BufferedWriter writer = null;

        String line = null;
        while ((line = in.readLine()) != null) {

            writer = new BufferedWriter(new FileWriter("textfile.txt"));
            writer.write(line);
            System.out.println(line);

            writer.close();
        }

    } catch (IOException e) {
        e.printStackTrace();

    }

   }
}

2
通过在每次迭代中创建FileWriter,文件会被覆盖。在循环外声明Writers,并在循环后关闭它。(顺便说一句,你的代码很难读,请遵守一些一致的缩进下次,这样更容易发现这样的错误。) - qqilihq
请注意,现在应该使用 Java 的新 IO 库,称为 NIO。 核心类是 PathsPathFiles。 例如,您可以使用 Paths.get("filename") 查找文件或使用 Files.write(pathToFile, stuffToWrite, options) 向文件写入内容。 - Zabuzard
2个回答

3

正如其他答案所述,问题在于您正在while循环内创建BufferedWriter实例,因此只有最后一行才会打印到文件中。

使用try-with-resources编写此程序的更好方法之一是 -

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;

public class TextFile {

    public static void main(String[] args) throws IOException {
        try {
            Process p = Runtime.getRuntime().exec("git log");

            try (BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
                    BufferedWriter writer = new BufferedWriter(new FileWriter("textfile.txt"))) {

                String line = null;
                while ((line = in.readLine()) != null) {
                    writer.write(line);
                    writer.newLine();
                    System.out.println(line);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();

        }
    }
}

0
问题在于您在循环内创建了一个新的BufferedWriter。其次,您还在循环内关闭了写入器。最后,您的代码块有点混乱 - 如果您重新格式化代码(在Eclipse中使用Ctrl-F自动完成),则代码块将更清晰。
您的代码应该像这样,在try/catch块的try部分内:
    BufferedWriter writer = (new FileWriter ("textfile.txt"));

    String line =null;
    while ((line= in.readLine()) !=null) {
        writer.write(line);
        System.out.println(line);
    }
    writer.close();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接