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 packagecom.test.a;2
3 importjava.io.File;4 importjava.io.FileInputStream;5 importjava.io.FileNotFoundException;6 importjava.io.IOException;7 importjava.util.Scanner;8
9 public classTestSerialversionUID {10 public static void main(String[] args) throwsIOException {11 try{12 FileInputStream fis = new FileInputStream(new File("C:\\Users\\hermioner\\Desktop\\test.txt"));13 //将标准输入重定向为文件的输入。
14 System.setIn(fis);15 Scanner sc = newScanner(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 I2 love3 china4 I5 love6 my7 family
View Code
说明:将文件test.txt中得内容作为输入,来代替了键盘输入
2. 重定向输出流
1 packagecom.test.a;2
3 importjava.io.FileNotFoundException;4 importjava.io.FileOutputStream;5 importjava.io.IOException;6 importjava.io.PrintStream;7
8 public classTestSerialversionUID {9 public static void main(String[] args) throwsIOException {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 packagecom.test.a;2
3 importjava.io.FileNotFoundException;4 importjava.io.IOException;5 importjava.io.PrintStream;6
7 public classTestSerialversionUID {8 public static void main(String[] args) throwsIOException {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之前必须对其进行包装。
参考文献:
<>