前言

在学习 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. 提示符 “ | ”
  • 将一个程序的输出重定向为另一个程序的输入叫做 管道

  • 例如,这条命令

  • 这条命令将 RandomSeq 的标准输出和 Average 的标准输入指定为同一个流。它的效果就像在 Average 运行时 RandomSeq 将它生成的数字输入了终端窗口。