Java 重定向與管道

前言

在學習 Sedgewick《算法4》 的第一章過程中,彌補了很多基礎知識。在此做個簡單的記錄。

重定向

標準輸入輸出使我們能夠利用許多操作系統都支持的命令行的擴展功能。只需要向啓動程序的命令中加入一個簡單的提示符,就可以將它的標準輸入 重定向 至一個文件。文件的內容既可以永久保存,也可以作爲另一個程序的輸入,簡單來說就是下面的例子:

1. 提示符 “ > ”
  • RandomSeq是一個生成隨機數的測試代碼,其中 StdOut 、StdRandom 都是書中提供的封裝好的API,一個封裝了標準輸出,另一個封裝了隨機數的相關方法。代碼如下
package edu.princeton.cs.yytest;

import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdRandom;

public class RandomSeq {
    public static void main(String[] args) {

        int N  = Integer.parseInt(args[0]);
        double lo = Double.parseDouble(args[1]);
        double hi = Double.parseDouble(args[2]);
        for (int i = 0; i < N; i++) {
            double x = StdRandom.uniform(lo, hi);
            StdOut.printf("%.3f \n", x);
        }
    }
}
  • 當我們運行時,會將生成的 N 個隨機數輸出在控制檯上,而通過重定向可以將 N 個隨機數輸出至一個文件中,例如
D:\codes_learn\algs4\out>java edu.princeton.cs.yytest.RandomSeq 10 100.0 200.0 > data2
  • 運行後終端窗口中不會出現任何輸出:它們都被直接寫入 ” > ” 號之後的文件中了。
    這裏寫圖片描述
2. 提示符 “ < ”
  • 既然 ” > ” 是輸出,那麼相應的 ” < ” 就是輸入了,它代表可以從指定的文件中讀取數據,來當作程序的輸入。
  • Average是一個求平均數的程序,部分代碼如下
public static void main(String[] args) { 
        int count = 0;       // number input values
        double sum = 0.0;    // sum of input values

        // read data and compute statistics
        while (!StdIn.isEmpty()) {
            double value = StdIn.readDouble();
            sum += value;
            count++;
        }

        // compute the average
        double average = sum / count;

        // print results
        StdOut.println("Average is " + average);
    }
  • 運行如下命令,這裏的 data2 就是上面隨機數生成的數據,算出這些隨機數的平均值。
D:\codes_learn\algs4\out>java edu.princeton.cs.algs4.Average < data2
  • 運行結果
Average is 161.7387
3. 提示符 “ | ”
  • 將一個程序的輸出重定向爲另一個程序的輸入叫做 管道

  • 例如,這條命令
    pipe

  • 這條命令將 RandomSeq 的標準輸出和 Average 的標準輸入指定爲同一個流。它的效果就像在 Average 運行時 RandomSeq 將它生成的數字輸入了終端窗口。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章