将Java输出同时写入控制台和文本文件的更简单方法?

3

我对Java不是很熟悉,但我有一次考试要来了,所以我一直在练习。我的进步虽然缓慢但稳定。我正在做的一个练习要求我将数组计算的输出打印到控制台,并创建一个名为temperature.txt的文件,其中包含相同格式的控制台输出。

我已经知道如何实现其中一个,但同时实现两个我遇到了麻烦(记住我是一个进展缓慢的学习者)。是否有更简单的初学者方法需要注意?

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DecimalFormat;

public class Temperature {

    public static void main(String[] args) throws IOException{ 
        double[] temps = {100, 98, 80.5, 90.2, 99.4, 89.1};
        MaxMin(temps);

    }

    public static void MaxMin(double[]temps) throws IOException{
        FileWriter fwriter = new FileWriter("Temperatures.txt", true);
        PrintWriter outputfile = new PrintWriter(fwriter);
        double min= Double.MAX_VALUE;
        double max= Double.MIN_VALUE;
        double sum = 0;

        DecimalFormat formatter = new DecimalFormat("0.0");

        for(int i = 0;i<temps.length;i++){
            sum += temps[i];
            if(temps[i] > max){
                max = temps[i];
            }
            if(temps[i]< min){
                min = temps[i];
            }
        }

        double avg = sum / temps.length;
        outputfile.println("Average Temp: " + formatter.format(avg));
        outputfile.println("Maximum Temp: " + formatter.format(max));
        outputfile.println("Minimum Temp: " + formatter.format(min));
        outputfile.close();
    }
}

我上面的代码打印了文本,但控制台没有任何输出。
编辑:在结尾添加三个System.out.println语句来满足两个要求是否可行?像这样:
System.out.println("Average Temp: " + formatter.format(avg));
System.out.println("Maximum Temp: " + formatter.format(max));
System.out.println("Minimum Temp: " + formatter.format(min));

outputfile.println("Average Temp: " + formatter.format(avg));
outputfile.println("Maximum Temp: " + formatter.format(max));
outputfile.println("Minimum Temp: " + formatter.format(min));
outputfile.close();

使用日志记录。Java中的Log4j。同时输出控制台和文本。 - Digital Alchemist
关于您的新编辑,为了可读性,我会做以下两件事之一。我要么创建一个大字符串,并嵌入换行符,这样您就可以进行单个控制台打印和单个文件写入,要么我会交替使用,例如第1行和第2行写/打印平均温度,第3行和第4行写/打印最高温度等等。 - nhgrif
5个回答

4

Commons IO提供了一个TeeOutputStream,可以同时将所有内容写入两个输出流。


虽然这是一个很好的工程问题答案,但如果是为了考试,可能DarkD需要自己写,所以查看源代码可能比使用库更好。 - Amadan

4
在您的情况下,最简单的方法是创建一个output方法:
private void output(final String msg, PrintStream out1, PrintWriter out2) {        
    out1.println(msg);
    out2.println(msg);
}

使用方式如下:
output("your message", System.out, outputfile);

1
首先,如果控制台和文件之间的格式必须完全相同,则我会将所有输出保存到单个String中,并嵌入'\n'字符等,然后一次性打印/写入该String
我不知道是否有一种同时写入文件和控制台的方法。不过你可以编写一个函数来完成这两个操作。

哈哈,我从没这么想过。就我的问题而言,同时使用System.out和PrintWriter似乎是可行的。最终我只是像这样在结尾添加了System.out.println语句。 - DarkD

1

Log4j 是一个可靠、快速和灵活的日志框架,用于控制台和文件附加。

日志示例,将日志附加到控制台和文件中!


0
    public static void MaxMin(double[] temps) throws IOException {
    FileWriter fwriter = new FileWriter("Temperatures.txt", true);
    PrintWriter outputfile = new PrintWriter(fwriter);
    double min = Double.MAX_VALUE;
    double max = Double.MIN_VALUE;
    double sum = 0;

    DecimalFormat formatter = new DecimalFormat("0.0");

    for (int i = 0; i < temps.length; i++) {
        sum += temps[i];
        if (temps[i] > max) {
            max = temps[i];
        }
        if (temps[i] < min) {
            min = temps[i];
        }
    }
    double avg = sum / temps.length;



    String str = "Average Temp: " + formatter.format(avg) + "\n"
            + "Maximum Temp: " + formatter.format(max) + "\n"
            + "Minimum Temp: " + formatter.format(min);
    System.out.println(str);
    outputfile.println(str);
    outputfile.close();

}

创建一个字符串,然后将其打印两次,\n 表示换行。

如果您想打印多个字符串,我会使用Epoch在https://dev59.com/d3fZa4cB1Zd3GeqPRnTR#19107954中提到的方法。 - YAMM

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