• 中文
    • English
  • 注册
  • 赞助本站

    • 支付宝
    • 微信
    • QQ

    感谢一直支持本站的所有人!

    • 查看作者
    • 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
    • 5.3k
    • 请登录之后再进行评论

      登录
    • 做任务
    • 实时动态
    • 偏好设置
    • 返回顶部
    • 单栏布局 侧栏位置: