25 Java学习之标准I/O流重定向

Posted Hermioner

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了25 Java学习之标准I/O流重定向相关的知识,希望对你有一定的参考价值。

Java的System类提供了一些简单的静态方法调用,以允许我们对标准输入、输出和错误I/O流进行重定向:

  • setIn(InputStream)
  • setOut(PrintStream)
  • setErr(PrintStream)

如果我们突然开始在显示器上创建大量输出,而这些输出滚动得太快以至于无法阅读时,重定向输出就显得极为有用(比如重定向到一个文件中进行输出阅读)

一. 三个静态变量

  • System.in (默认从键盘输入)
  • System.out(默认输出到显示器)
  • System.err

二. 重写向方法

  • setIn(InputStream)
  • setOut(PrintStream)
  • setErr(PrintStream)

System类的out、err 和in成员变量是final类型的,不能直接赋值,要通过应的setters方法来改变流。

三. 举例

1. 重定向输入流

假设test.txt文件中有如下内容:

 1 package com.test.a;
 2 
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.FileNotFoundException;
 6 import java.io.IOException;
 7 import java.util.Scanner;
 8 
 9 public class TestSerialversionUID {
10     public static void main(String[] args) throws IOException {
11         try {
12             FileInputStream fis = new FileInputStream(new File("C:\\\\Users\\\\hermioner\\\\Desktop\\\\test.txt"));
13             //将标准输入重定向为文件的输入。
14             System.setIn(fis);
15             Scanner sc = new Scanner(System.in);
16             //判断输入是否还有下一项,输出System.in中的内容
17             while(sc.hasNext()){
18                 String str = sc.next();
19                 System.out.println(str);
20             }
21         } catch (FileNotFoundException e) {
22             e.printStackTrace();
23         }
24 }  
25 
26     
27 
28 }
View Code
1 I
2 love
3 china
4 I
5 love
6 my
7 family
View Code

说明:将文件test.txt中得内容作为输入,来代替了键盘输入

2. 重定向输出流

 1 package com.test.a;
 2 
 3 import java.io.FileNotFoundException;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6 import java.io.PrintStream;
 7 
 8 public class TestSerialversionUID {
 9     public static void main(String[] args) throws IOException {
10          try {
11                 //1.声明一个输出流PrintStream对象
12                 PrintStream ps=new PrintStream(new FileOutputStream("C:\\\\Users\\\\hermioner\\\\Desktop\\\\test.txt",true));   //追加内容
13                 //2.重定向标淮输出流
14                 System.setOut(ps);
15                 //3.使用PrintStream对象向流中写信息
16                 System.out.println("hello");
17                 ps.close();
18             } catch (FileNotFoundException e) {
19                 e.printStackTrace();
20             }
21   }  
22 }
View Code

执行结果:

3. 重定向错误流

 1 package com.test.a;
 2 
 3 import java.io.FileNotFoundException;
 4 import java.io.IOException;
 5 import java.io.PrintStream;
 6 
 7 public class TestSerialversionUID {
 8     public static void main(String[] args) throws IOException {
 9          try {
10             //重定向错误流
11                 PrintStream errstream=System.err;
12                 PrintStream errprint=new PrintStream("C:\\\\Users\\\\hermioner\\\\Desktop\\\\test.txt");
13                 System.setErr(errprint);//这里的参数是一个PrintStream
14                 String string1="这是重定向错误输出流的内容";
15                 System.err.println(string1);
16                 errstream.close();
17             } catch (FileNotFoundException e) {
18                 e.printStackTrace();
19             }
20   }  
21 }
View Code

总结:标准I/O这个术语参考得时Unix中“程序所使用得单一信息流”这个概念。按照标准I/O模型,Java提供了System.in、System.out、System.err。其中System.out/err已经事先被包装成了printStream对象, 但System.in却是一个没有被包装过得未经加工得InputStream。这意味着尽管我们可以立即使用System.out/err,但是在读取System.in之前必须对其进行包装。

 

参考文献:

<<Thinking in Java>>

以上是关于25 Java学习之标准I/O流重定向的主要内容,如果未能解决你的问题,请参考以下文章

Java学习之i/o系统

JAVA学习之-I/O流

Linux学习之“exit函数”

Linux学习之管道符和重定向详解

c语言如何将输入输出流重定向到一个字符串?

将输出流以外的两个或多个 Powershell 流重定向到同一个文件