• 中文
    • English
  • 注册
  • 查看作者
  • Java中重定向与管道的实现

    一.  前言

    在学习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()的时候,它就向输出流的开头删除了一个字符串

  • 0
  • 0
  • 0
  • 6.4k
  • 请登录之后再进行评论

    登录
    单栏布局 侧栏位置: