如何将结果发送到文件并同时输出
How to sent a result to a file and to output at the same time
这款游戏与 FizzBuzz 相似,但如您所见,用词不同。
我需要将 "Nardo" 的结果打印到输出 (System.out.println
) 并在调用时同时打印到文件。
我制作了 2 classes,一个用于 FizzBuzz 游戏,另一个用于将一些文本发送到文件中。这个可以正常工作,但我不知道如何将它与 FizzBuzz Class.
结合使用
我刚刚将 class OutputToFile 调用到 FizzBuzz 中,但我不知道如何继续。
1) 首先 Class
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) 第二个 Class
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);
}
}
}
下面的 class 会将您进行的调用拆分为 2 个 OutputStream。
对于您的程序,不是从文件创建 PrintStream,而是首先创建一个 FileOutputStream。然后从您的 FileOutputStream 和 System.out 创建一个新的 SplitOutputStream。使用 SplitOutputStream,您所做的任何一次写入都将同时写入 FileOutputStream 和 System.out。通过将 PrintStream 包装在 SplitOutputStream 上,您现在可以在 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
这款游戏与 FizzBuzz 相似,但如您所见,用词不同。
我需要将 "Nardo" 的结果打印到输出 (System.out.println
) 并在调用时同时打印到文件。
我制作了 2 classes,一个用于 FizzBuzz 游戏,另一个用于将一些文本发送到文件中。这个可以正常工作,但我不知道如何将它与 FizzBuzz Class.
结合使用我刚刚将 class OutputToFile 调用到 FizzBuzz 中,但我不知道如何继续。
1) 首先 Class
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) 第二个 Class
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);
}
}
}
下面的 class 会将您进行的调用拆分为 2 个 OutputStream。
对于您的程序,不是从文件创建 PrintStream,而是首先创建一个 FileOutputStream。然后从您的 FileOutputStream 和 System.out 创建一个新的 SplitOutputStream。使用 SplitOutputStream,您所做的任何一次写入都将同时写入 FileOutputStream 和 System.out。通过将 PrintStream 包装在 SplitOutputStream 上,您现在可以在 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