一. 前言
在学习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 < n; 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-z> //意思是在命令行中按ctrl + D 键,然后回车
类似,我们可以重定向标准输入使StdIn从文件而不是从终端应用程序中读取数据
java Average < data.txt
将上面这些结合起来,将一个程序的输出重定向为另一个程序的输入,叫做管道
将RandomSeq的输出重定向为Average类的输入
java RandomSeq 1000 100.0 200.0 | java Average
接下来说一下,为什么在前言中我觉得管道非常的有意思呢?
是因为它突破了我们能够处理的输入输出流的长度限制:
例如我们将RandomSeq里的n设置为1000000000,按照常理来说,我们计算机是没有足够的空间来存储十亿个数的
但是当RandomSeq调用StdOut.println()的时候,它就向输出流的末尾添加了一个字符串
当Average调用StdIn.readInt()的时候,它就向输出流的开头删除了一个字符串
请登录之后再进行评论