一. 前言
在学习Algorithms Fourth Edition第一章的时候,遇到了关于重定向与管道的问题
觉得非常的有趣,整理如下:
二. 实现
首先,我们先写一个用于输出的类:
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdRandom;
//输出n个lo~hi之间的随机值
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
double x = StdRandom.uniform(lo, hi);
StdOut.printf("%.2f\n", x);
}
}
}
我们可以用下命令行来将RandomSeq类中的输入流写入到一个叫data.txt的文件中
javac RandomSeq.java
java RandomSeq 1000 100.0 200.0 > data.txt //将1000个100~200之间的随机数写入到data.txt文件中
接下来,我们写一个用于输入的类:
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
//输出所有数的平均值
public class Average {
public static void main(String[] args) {
int count = 0;
double sum = 0.0;
while (!StdIn.isEmpty()) {
double value = StdIn.readDouble();
sum += value;
count++;
}
double average = sum / count;
StdOut.printf("Average is %.5f\n", average);
}
}
我们可以用下命令行来输入一些数字传入Average类中
javac Average.java
java Average
3
4
5
//意思是在命令行中按ctrl + D 键,然后回车
类似,我们可以重定向标准输入使StdIn从文件而不是从终端应用程序中读取数据
java Average
将上面这些结合起来,将一个程序的输出重定向为另一个程序的输入,叫做管道
将RandomSeq的输出重定向为Average类的输入
java RandomSeq 1000 100.0 200.0 | java Average
接下来说一下,为什么在前言中我觉得管道非常的有意思呢?
是因为它突破了我们能够处理的输入输出流的长度限制:
例如我们将RandomSeq里的n设置为1000000000,按照常理来说,我们计算机是没有足够的空间来存储十亿个数的
但是当RandomSeq调用StdOut.println()的时候,它就向输出流的末尾添加了一个字符串
当Average调用StdIn.readInt()的时候,它就向输出流的开头删除了一个字符串