Java 輸入/輸出——重定向標准輸入/輸出


  在System類中提供了如下三個重定向標准輸入/輸出方法。

static void setErr​(PrintStream err)
Reassigns the "standard" error output stream.(重定向“標准”錯誤輸出流)
static void setIn​(InputStream in)
Reassigns the "standard" input stream.(重定向“標准”輸入流)
static void setOut​(PrintStream out)
Reassigns the "standard" output stream.(重定向“標准”輸出流)
static void setProperties​(Properties props)
Sets the system properties to the  Properties argument.                                                                                                 
static String setProperty​(String key,String value)
Sets the system property indicated by the specified key.
static void setSecurityManager​(SecurityManager s)
Sets the System security.

  下面程序通過重定向標准輸出流,將System.out的輸出重定向到文件輸出,而不是在屏幕上輸出。

  首先回顧PrintStream的構造器:

Constructor Description
PrintStream​(File file)
Creates a new print stream, without automatic line flushing, with the specified file.
PrintStream​(File file, String csn)
Creates a new print stream, without automatic line flushing, with the specified file and charset.
PrintStream​(OutputStream out)
Creates a new print stream.
PrintStream​(OutputStream out, boolean autoFlush)
Creates a new print stream.
PrintStream​(OutputStream out, boolean autoFlush,String encoding)
Creates a new print stream.
PrintStream​(String fileName)
Creates a new print stream, without automatic line flushing, with the specified file name.
PrintStream​(String fileName, String csn)
Creates a new print stream, without automatic line flushing, with the specified file name and charset.
 1 package com.zyjhandsome.io;
 2 
 3 import java.io.*;
 4 
 5 public class RedirectOut {
 6 
 7     public static void main(String[] args) {
 8         // TODO Auto-generated method stub
 9         try {
10             PrintStream ps = new PrintStream(new FileOutputStream("D:\\User_zhaoyingjun\\JavaSE\\Test\\RedirectOut.log"));
11             // 將標准的輸出重定向到ps輸出流
12             System.setOut(ps);
13             // 向標准輸出輸出一個字符串
14             System.out.println("普通字符串");
15             // 向標准輸出輸出一個對象
16             System.out.println(new RedirectOut());
17         } catch (FileNotFoundException e) {
18             // TODO Auto-generated catch block
19             e.printStackTrace();
20         } 
21     }
22 }

   在“Redirect.log”文件中輸出結果:

1 普通字符串
2 com.zyjhandsome.io.RedirectOut@71be98f5

  下面程序重定向標准輸入流,從而可以將System.in重定向到指定文件,而不是鍵盤輸入。

 1 package com.zyjhandsome.io;
 2 
 3 import java.io.*;
 4 import java.util.*;
 5 
 6 public class RedirectIn {
 7 
 8     public static void main(String[] args) {
 9         // TODO Auto-generated method stub
10         try {
11             FileInputStream fis = new FileInputStream("D:\\User_zhaoyingjun\\JavaSE\\Java_Eclipse_Workspace\\HelloWorld2\\src\\com\\zyjhandsome\\io\\RedirectIn.java");
12             // 將標准輸入流 重定向到fis輸入流
13             System.setIn(fis);
14             // 使用System.in創建Scanner對象,用於獲取標准輸入
15             Scanner sc = new Scanner(System.in);
16             // 增加下面一行只把回車作為分隔符
17             sc.useDelimiter("\n");
18             // 判讀是否還有下一個輸入項
19             while (sc.hasNext())
20             {
21                 // 輸出輸入項
22                 System.out.println("鍵盤輸入的內容是:" + sc.next());                
23             }            
24         } catch (FileNotFoundException e) {
25             // TODO Auto-generated catch block
26             e.printStackTrace();
27         }
28     }
29 }

  輸出結果:

 1 鍵盤輸入的內容是:package com.zyjhandsome.io;
 2 
 3 鍵盤輸入的內容是:
 4 
 5 鍵盤輸入的內容是:import java.io.*;
 6 
 7 鍵盤輸入的內容是:import java.util.*;
 8 
 9 鍵盤輸入的內容是:
10 
11 鍵盤輸入的內容是:public class RedirectIn {
12 
13 鍵盤輸入的內容是:
14 
15 鍵盤輸入的內容是:    public static void main(String[] args) {
16 
17 鍵盤輸入的內容是:        // TODO Auto-generated method stub
18 
19 鍵盤輸入的內容是:        try {
20 
21 鍵盤輸入的內容是:            FileInputStream fis = new FileInputStream("D:\\User_zhaoyingjun\\JavaSE\\Java_Eclipse_Workspace\\HelloWorld2\\src\\com\\zyjhandsome\\io\\RedirectIn.java");
22 
23 鍵盤輸入的內容是:            // 將標准輸入流 重定向到fis輸入流
24 
25 鍵盤輸入的內容是:            System.setIn(fis);
26 
27 鍵盤輸入的內容是:            // 使用System.in創建Scanner對象,用於獲取標准輸入
28 
29 鍵盤輸入的內容是:            Scanner sc = new Scanner(System.in);
30 
31 鍵盤輸入的內容是:            // 增加下面一行只把回車作為分隔符
32 
33 鍵盤輸入的內容是:            sc.useDelimiter("\n");
34 
35 鍵盤輸入的內容是:            // 判讀是否還有下一個輸入項
36 
37 鍵盤輸入的內容是:            while (sc.hasNext())
38 
39 鍵盤輸入的內容是:            {
40 
41 鍵盤輸入的內容是:                // 輸出輸入項
42 
43 鍵盤輸入的內容是:                System.out.println("鍵盤輸入的內容是:" + sc.next());                
44 
45 鍵盤輸入的內容是:            }            
46 
47 鍵盤輸入的內容是:        } catch (FileNotFoundException e) {
48 
49 鍵盤輸入的內容是:            // TODO Auto-generated catch block
50 
51 鍵盤輸入的內容是:            e.printStackTrace();
52 
53 鍵盤輸入的內容是:        }
54 
55 鍵盤輸入的內容是:    }
56 
57 鍵盤輸入的內容是:}

   上面程序創建了一個FileInputStream輸入流,並使用System的setIn()方法將系統標准輸入重定向到該文件輸入流。運行上面程序,程序不會等待用戶輸入,而是直接輸出了RedirectIn.java文件的內容,這表明程序不再使用鍵盤作為標准輸入,而是使用RedirectIn.java文件作為標准輸入源。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM