【问题标题】:BufferedWriter isn't writing to fileBufferedWriter 没有写入文件
【发布时间】:2020-03-12 17:30:48
【问题描述】:

我正在用 Java 编写一个程序来读取 Linux 机器上的 CPU 温度,并每 4 秒将结果输出到一个文件中。 temps 在间隔成功返回到控制台,但不会出现在文件中,也不会引发错误。这也是我第一次使用BufferedWriter,如果使用不当,我深表歉意。

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

public class tempapp{
    public static void main(String[] args) throws IOException, InterruptedException {
        String fileName = "temps.txt";
        TimerTask task = new TimerTask() {
            @Override
            public void run(){
                // task goes here

                List<String> commands = new ArrayList<>();
                //build command
                commands.add("/usr/bin/sensors");
                //args
                //commands.add("");
                System.out.println(commands);

                ProcessBuilder pb = new ProcessBuilder(commands);
                pb.directory(new File("/home/ethano"));
                pb.redirectErrorStream(true);
                Process process = null;
                try {
                    process = pb.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                //Read output
                StringBuilder out = new StringBuilder();
                BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
                String line = null, previous = null;
                while (true) {
                    try {
                        if (!((line = br.readLine()) != null)) break;
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    if (!line.equals(previous)) {
                        previous = line;
                        out.append(line).append('\n');
                        System.out.println(line);
                        try {
                            File file = new File ("/home/ethano/Desktop/temps.txt");
                            BufferedWriter wr = new BufferedWriter(new FileWriter(file));
                        wr.write(line);
                        wr.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }

                //Check result
                try {
                    if (process.waitFor() == 0) {
                        //System.exit(0);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //weird termination
                //System.err.println(commands);
                //System.err.println(out.toString());
                //System.exit(1);
            }
        };

        Timer timer = new Timer();
        long delay = 0;
        long intervalPeriod = 4 * 1000;

        //schedules task to run in interval
        timer.scheduleAtFixedRate(task, delay, intervalPeriod);


    }
}

【问题讨论】:

    标签: java linux text-files bufferedwriter


    【解决方案1】:

    您的作者正在将每一行写入文件。

    但是,由于您在每行之前重新打开并截断文件,并且/usr/bin/sensors 输出以空行结束,因此文件将只包含最后一个空行。

    查看这一点的最简单方法是告诉您的 FileWriter 追加而不是截断:

    BufferedWriter wr = new BufferedWriter(new FileWriter(file, true));
    

    如果您希望文件包含命令的所有输出,但前提是它与上次运行的不同,那么显然您不能逐行做出此决定。相反,您必须将所有行读入一个字符串,并将其与上一次运行进行比较。

    【讨论】:

    • 我不打算比较不同的数据,而是删除旧的输出并附加新的数据集。当我可以轻松删除时,我认为没有必要进行比较。感谢您的解决方案。
    • 一件事。在文本文件中保留输出格式的最有效方法是什么?
    • 将输出转储到文件的最有效方法是让您的ProcessBuilder 重定向到文件,而不是通过 Java 读取它。通过 Java 保存输出的最可靠方法是读取和写入字节数组而不是行。最简单的方法是在每一行之后做一个wr.newLine();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多