Java 之 标准输入流 与 标准输出流 一、标准输入流 二、标准输出流

  Scanner 是作为一个扫描器,它能够以标准格式以及扫描器语言环境的格式的指定文件、流中读取数据。

  常用构造方法:

Scanner(File source):构造一个新的 Scanner,它生成的值是从指定文件扫描的
Scanner(InputStream source):构造一个新的 Scanner,它生成的值是从指定的输入流扫描的
Scanner(Readable source):构造一个新的 Scanner,它生成的值是从指定源扫描的
Scanner(String source):构造一个新的 Scanner,它生成的值是从指定字符串扫描的

   而默认情况下是从键盘输入的数据中扫描,即 System.in 这其实 是 System类中的一个输入流。

    Demo:

 1     @Test    
 2     public void test01(){
 3         Scanner input = new Scanner(System.in);
 4         System.out.print("请输入一个整数:");   //从键盘输入
 5         int num = input.nextInt();
 6         System.out.println("num = " + num);
 7         input.close();
 8     }
 9 
10     @Test
11     public void test02() throws FileNotFoundException{
12         Scanner input = new Scanner(new FileInputStream("1.txt"));//InputStream
13         
14         while(input.hasNextLine()){
15             String line = input.nextLine();
16             System.out.println(line);
17         }
18         
19         input.close();
20     }
21 
22     @Test
23     public void test03() throws FileNotFoundException{
24         Scanner input = new Scanner(new File("1.txt"));  //InputStream
25         
26         while(input.hasNextLine()){
27             String line = input.nextLine();
28             System.out.println(line);
29         }
30         
31         input.close();
32     }
33 
34     @Test
35     public void test04() throws FileNotFoundException{
36         Scanner input = new Scanner("1.txt");    //InputStream
37         
38         while(input.hasNextLine()){
39             String line = input.nextLine();
40             System.out.println(line);
41         }
42         
43         input.close();
44     }
45 
46 
47     @Test
48     public void test05() throws FileNotFoundException{
49         Scanner input = new Scanner(new File("d:/1.txt"),"GBK");//使用InputStream,并指定字符集
50         
51         while(input.hasNextLine()){
52             String line = input.nextLine();
53             System.out.println(line);
54         }
55         
56         input.close();
57     }

二、标准输出流

  进入到 System 类中,发现里面有三个常量字段。

  Java 之 标准输入流 与 标准输出流
一、标准输入流
二、标准输出流   “标准”输入流 System.in

   Java 之 标准输入流 与 标准输出流
一、标准输入流
二、标准输出流    “标准”输出流 System.out

   Java 之 标准输入流 与 标准输出流
一、标准输入流
二、标准输出流    “标准”错误输出流  System.err

   可以看到这三个字段都用 final修饰的,是常量,并被赋值为 null,但是打印的时候,它们并不是 null。

  接着发现了这三个方法:(重定向)

  Java 之 标准输入流 与 标准输出流
一、标准输入流
二、标准输出流

   Java 之 标准输入流 与 标准输出流
一、标准输入流
二、标准输出流

   Java 之 标准输入流 与 标准输出流
一、标准输入流
二、标准输出流

   Java 之 标准输入流 与 标准输出流
一、标准输入流
二、标准输出流

   Java 之 标准输入流 与 标准输出流
一、标准输入流
二、标准输出流

   通过上面的这些方法可以看到,上面的三个字段,在Java层面是常量对象,但是底层调用本地方法(调用C等底层语言)进行修改了。

  输出默认到控制台,其他控制台是个文件,查看 System类中的 initializeSystemClass() 方法

Java 之 标准输入流 与 标准输出流
一、标准输入流
二、标准输出流

   这个方法里面有上面这三个方法,分别是把它们指向控制台。

   而对于输出流 Out,我们还以为给它指定一个新的目标。

  Demo:

 1   @Test
 2     public void test01(){
 3         PrintStream out = System.out;
 4         System.out.println(out);
 5     }
 6   @Test
 7     public void test02() throws FileNotFoundException{
 8         System.setOut(new PrintStream("1.txt"));  //指定输出流,重定向
 9         
10         System.out.println("aaaa");
11         System.out.println("bbb");
12         System.out.println("ccc");
13         System.out.println("ddd");
14     }

   

  Demo : 重定向 System.in 和 System.out

 1 import java.io.FileDescriptor;
 2 import java.io.FileInputStream;
 3 import java.util.Scanner;
 4 
 5 public class TestSystemIn {
 6     public static void main(String[] args) throws Exception{
 7         //重定向从文件输入
 8         System.setIn(new FileInputStream("java\info.txt"));
 9         Scanner input = new Scanner(System.in);
10         while(input.hasNext()){
11             String str = input.nextLine();
12             System.out.println(str);
13         }
14         input.close();
15 
16         //重定向回键盘输入
17         System.setIn(new FileInputStream(FileDescriptor.in));
18     }
19 }
20 
21 
22 import java.io.FileDescriptor;
23 import java.io.FileOutputStream;
24 import java.io.PrintStream;
25 
26 public class TestSystemOut {
27     public static void main(String[] args) throws Exception{
28         System.out.println("hello");
29         //重定向输出到文件
30         System.setOut(new PrintStream("java\print.txt"));
31         System.out.println("world");
32         //重定向回控制台
33         System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
34         System.out.println("java");
35     }
36 }