【问题标题】:How to sent a result to a file and to output at the same time如何将结果发送到文件并同时输出
【发布时间】:2017-09-20 23:22:37
【问题描述】:

这个游戏就像FizzBu​​zz,但你可以看到不同的单词。

我需要在调用时将“Nardo”的结果同时打印到输出(System.out.println)和文件中。

我为 FizzBu​​zz 游戏制作了 2 个类,另一个用于将一些文本发送到文件中。这个工作正常,但我不知道如何将它与 FizzBu​​zz 类结合起来。

我刚刚在 FizzBu​​zz 中调用了 OutputToFile 类,但我不知道如何继续。

1) 头等舱

public class BaroSello {    
    private OutputToFile outputfile = new OutputToFile();
    for(int i=1; i<input; i++){
        if ((i % 3 == 0 && i % 5 == 0))
            System.out.println("BaroSello");
        else if (i % 3 == 0)
            System.out.println("Baro");
        else if (i % 5 == 0)
            System.out.println("Sello");
        else if (i%7==0)
        // here I need the output to file and to terminal
            System.out.println("Nardo");
        else
            System.out.println(i);
    }
}

2) 二等舱

    public class OutputToFile {

    public static void main(String[] args) {
        try {
            PrintStream myconsole = new PrintStream(new File("/Users/xxx/Desktop/output.txt"));
            System.setOut(myconsole);
            myconsole.println("hello");
        } catch (FileNotFoundException fx) {

            System.out.println(fx);
        }
    }
}

【问题讨论】:

  • 编写一个扩展 PrintStream 的类,该类可写入控制台和文件。将 System.setOut() 方法与您的类的实例一起使用。
  • 您可以相对容易地将System.out(和System.err)重定向到不同的PrintStreams,诀窍是,正如您所说,您想将其发送到两个不同的位置 - @987654321 @ 基本上是这样做的,虽然它旨在将输出打印到 GUI,但基本思想是相同的。我还会考虑查看几乎任何日志 API,它也可以做到这一点

标签: java file output fizzbuzz


【解决方案1】:

下面的类会将您发出的调用拆分为 2 个 OutputStream。

对于您的程序,不是从文件创建 PrintStream,而是首先创建一个 FileOutputStream。然后从您的 FileOutputStream 和 System.out 创建一个新的 SplitOutputStream。使用 SplitOutputStream,您所做的任何单个写入都将同时写入 FileOutputStream 和 System.out。通过在 SplitOutputStream 上包装 PrintStream,您现在可以在 PrintStream 上执行 println,并且输出将发送到文件和 System.out。

import java.io.*;

public class SplitOutputStream extends OutputStream{

    public static void main(String[] args) throws Throwable{
        SplitOutputStream split=new SplitOutputStream(
            new FileOutputStream("c:\\text.txt"),
            System.out
        );
        PrintStream splitPs=new PrintStream(split);
        splitPs.println("some text");
        splitPs.flush();
        splitPs.close();

        //or (not both)
        PrintWriter splitPw=new PrintWriter(split);
        splitPw.println("some text");
        splitPw.flush();
        splitPw.close();
    }


    OutputStream o1;
    OutputStream o2;
    public SplitOutputStream(OutputStream o1,OutputStream o2){
        this.o1=o1;
        this.o2=o2;
    }
    @Override public void write(int b) throws IOException{
        o1.write(b);
        o2.write(b);
    }
    @Override public void write(byte[] b,int off,int len) throws IOException{
        o1.write(b,off,len);
        o2.write(b,off,len);
    }
    @Override public void flush() throws IOException{
        o1.flush();
        o2.flush();
    }
    @Override public void close() throws IOException{
        o1.close();
        o2.close();
    }
}

或者

    PrintStream originalSysOut=System.out;

    SplitOutputStream split=new SplitOutputStream(
        new FileOutputStream("c:\\work\\text.txt"),
        originalSysOut
    );
    PrintStream splitPs=new PrintStream(split,true);

    System.setOut(splitPs);

    System.out.println("some text");

上面的代码将 System.out 更改为输出到您的文件以及原始 System.out

【讨论】:

  • 如何将这个类调用到 FizzBu​​zz 算法中?
  • 如果我明白了,我可以使用我的 FizzBu​​zz 类而不用修改它,我的System.out.println 将直接转到文件和终端?如何根据要求选择其中之一?但是如果我需要更改 FizzBu​​zz 以连接到您的新班级,该怎么做呢?
猜你喜欢
  • 1970-01-01
  • 2011-07-20
  • 2011-01-08
  • 2020-06-15
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
相关资源
最近更新 更多