Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BufferedWriter不是';t写入文件_Java_Linux_Text Files_Bufferedwriter - Fatal编程技术网

Java BufferedWriter不是';t写入文件

Java BufferedWriter不是';t写入文件,java,linux,text-files,bufferedwriter,Java,Linux,Text Files,Bufferedwriter,我正在用Java编写一个程序,在Linux机器上读取CPU温度,并每4秒将结果输出到一个文件中。temp会在间隔期间成功返回到控制台,但不会出现在文件中,也不会引发错误。这也是我第一次使用BufferedWriter,如果我使用不当,我深表歉意 import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.Timer; import java.util.TimerTask; publi

我正在用Java编写一个程序,在Linux机器上读取CPU温度,并每4秒将结果输出到一个文件中。temp会在间隔期间成功返回到控制台,但不会出现在文件中,也不会引发错误。这也是我第一次使用
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);


    }
}
import java.io.*;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Timer;
导入java.util.TimerTask;
公共类临时应用程序{
公共静态void main(字符串[]args)引发IOException、InterruptedException{
字符串fileName=“temps.txt”;
TimerTask任务=新的TimerTask(){
@凌驾
公开募捐{
//任务就在这里
List命令=new ArrayList();
//生成命令
添加(“/usr/bin/sensors”);
//args
//命令。添加(“”);
System.out.println(命令);
ProcessBuilder pb=新的ProcessBuilder(命令);
目录(新文件(“/home/ethano”);
pb.重定向错误流(真);
Process=null;
试一试{
process=pb.start();
}捕获(IOE异常){
e、 printStackTrace();
}
//读取输出
StringBuilder out=新的StringBuilder();
BufferedReader br=新的BufferedReader(新的InputStreamReader(process.getInputStream());
String line=null,previous=null;
while(true){
试一试{
如果(!((line=br.readLine())!=null))中断;
}捕获(IOE异常){
e、 printStackTrace();
}
如果(!line.equals(上一个)){
上一个=行;
out.append(line.append('\n');
系统输出打印项次(行);
试一试{
File File=新文件(“/home/ethano/Desktop/temps.txt”);
BufferedWriter wr=新的BufferedWriter(新文件写入程序(文件));
wr.写入(行);
wr.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
//检查结果
试一试{
if(process.waitFor()==0){
//系统出口(0);
}
}捕捉(中断异常e){
e、 printStackTrace();
}
//奇怪的终止
//System.err.println(命令);
//System.err.println(out.toString());
//系统出口(1);
}
};
定时器=新定时器();
长延时=0;
长间隔期=4*1000;
//计划任务以间隔运行
timer.scheduleAtFixedRate(任务、延迟、间隔期);
}
}
您的编写器正在将每一行写入文件

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

最简单的方法是告诉FileWriter追加而不是截断:

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

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

我不打算比较不同的数据,而只是删除旧的输出并附加新的数据集。我认为当我可以很容易地删除时,就没有必要进行检查和比较了。谢谢你的解决方案。不过有一件事。在文本文件中保留输出格式的最有效方法是什么?将输出转储到文件的最有效方法是将
ProcessBuilder
重定向到文件,而不是通过Java读取。通过Java保存输出的最健壮的方法是读取和写入字节数组,而不是行。最简单的方法就是执行
wr.newLine()每行后面