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