重定向标准输入输出流 - Java

5
在编写c/c++代码时,使用freopen()非常方便。请参考以下代码片段 -
int main(){

 int n1, n2, result;

 freopen("input.txt", "rb", stdin);
 freopen("output.txt", "wb", sdtout);

 while(scanf("%d %d", &n1, &n2)==2 && n1>0 &&n2>0){
  ...
  ...
  ...
  printf("%d\n", result);
 }

 return 0;
}

在调试/测试小型控制台应用程序时,使用freopen()非常有用。我们可以将样本输入放入'input.txt'文件中,并每次重复使用它们,而不是手动在终端/控制台中提供输入。同样,我们也可以将输出打印到'output.txt'文件中。
现在我正在寻找一个类似的解决方案,可以在Java中重定向输入和输出到文本文件。我的目标是在处理一些数据时简化小型控制台/程序的调试。反复向终端/控制台提供这些数据作为输入有些繁琐。有人可以提供一些好的提示吗?

在命令行上使用 java -cp ... MyClass < input.txt > output.txt 有什么问题? - Peter Lawrey
3个回答

4
您可以使用System.setInSystem.setOut重新分配流。
System.setIn(new FileInputStream(new File("input.txt")));
System.setOut(new PrintStream(new File("output.txt")));

3

For System.out

System.setOut(new PrintStream(new File("output-file.txt")));

对于 System.err

System.setErr(new PrintStream(new File("err_output-file.txt")));

对于 System.in

System.setIn(new FileInputStream(new File("input-file.txt")));

*重置回控制台

System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
System.setErr(new PrintStream(new FileOutputStream(FileDescriptor.out)));
System.setIn(new FileInputStream(FileDescriptor.in));

1

要从文件获取数据而不是用户输入,你只需要在构造Scanner时稍作修改即可。

导入一些Java I/O类,然后执行以下操作:

try{
    Scanner input = new Scanner(new File("input_file_name.in"));
}
catch(FileNotFoundException e){
    e.printStackTrace();
}

然后像平常一样使用扫描仪,它会从文件中读取。
要将数据写入数据文件而不是标准输出,可以执行以下操作将标准输出更改为数据文件:
try{
FileOutputStream f = new FileOutputStream(new File("output_file_name.out"));
    PrintStream p = new PrintStream(f);
    System.setOut(p);
}
catch(Exception e){
    e.printStackTrace();
}

使用 System.out.print() 和 System.out.println() 的所有操作都将写入文件。


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