重新認識 Java 的 System.in
以前也寫過不少命令行的程序,處理文件時總需要通過參數指定路徑,直到今天看資料時發現了一種我自己從來沒用過的方式。這種方式讓我重新認識了System.in。
下面是一個簡單的Cat 命令的例子,這里提供了-n
參數用于配置是否顯示行號。
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Arrays;public class Cat { public static void main(String[] args) throws IOException { //是否顯示行號,使用參數 -n 啟用 boolean showNumber = args.length > 0 && Arrays.asList(args).contains("-n"); int num = 0; BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String line = reader.readLine(); while (line != null) { if (showNumber) { num++; System.out.printf("%1$8s %2$s%n", num, line); } else { System.out.println(line); } line = reader.readLine(); } }}
這個方法中用到了參數,參數只用于判斷是否存在-n
這個參數,沒有通過參數指定文件。
這里獲取文件內容的方式就是 System.in,從輸入流中讀取。輸入流中怎么提供文件內容呢?
就是通過輸入重定向到命令。針對上面的 Cat.java 文件執行下面的命令:
javac Cat.javajava Cat -n < Cat.java
先使用 javac 編譯,在通過 java 命令執行,通過輸入重定向將Cat.java 作為命令的輸入流。
上面命令執行后,輸出內容如下:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; public class Cat { public static void main(String[] args) throws IOException { boolean showNumber = args.length > 0 && Arrays.asList(args).contains("-n"); int num = 0; BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String line = reader.readLine(); while (line != null) { if (showNumber) { num++; System.out.printf("%1$8s %2$s%n", num, line); } else { System.out.println(line); } line = reader.readLine(); } } }
如果只是處理文件,和參數方式指定文件路徑沒太大的區別。但是如果通過管道方式,就可以很方便的將前面命令的輸出流作為輸入流繼續進行處理。例如下面的命令:
java Cat -n < Cat.java | java Cat -n
前一個命令的輸出會作為第二個命令的輸入,這會在原有行號的基礎上增加一個行號,結果如下:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; public class Cat { public static void main(String[] args) throws IOException { boolean showNumber = args.length > 0 && Arrays.asList(args).contains("-n"); int num = 0; BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String line = reader.readLine(); while (line != null) { if (showNumber) { num++; System.out.printf("%1$8s %2$s%n", num, line); } else { System.out.println(line); } line = reader.readLine(); } } }
合理使用這種方式可以在某些情況下起到良好的作用。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。
新聞熱點
疑難解答
圖片精選