Java程序如何知道如何访问该文件?

时间:2014-08-30 03:05:12

标签: java command-line arguments stdin

我一直在读这本书算法第4版。它的代码示例从命令行获取输入

String[] a = StdIn.readAllStrings();

并对它们进行排序。 StdIn.java的源代码在http://introcs.cs.princeton.edu/java/stdlib/StdIn.java中给出。堆排序的来源是http://algs4.cs.princeton.edu/24pq/Heap.java,但实际上并不相关。 主要功能如下:

public static void main(String[] args) {
    String[] a = StdIn.readAllStrings();
    Heap.sort(a);
    show(a);
}

没有明确提及args。然而,当我在命令行中传入一个文本文件作为参数时,它的工作原理如下:

   % more tiny.txt
   S O R T E X A M P L E
   % java Heap < tiny.txt
   A E E L M O P R S T X     

当没有给出引用时,有人可以告诉我程序如何在输入中读取。非常感谢先进!

编辑:更改了stdin java的链接。我的坏。

3 个答案:

答案 0 :(得分:1)

在命令行中,将文件作为< whatever传递给应用程序意味着whatever文件的内容将成为应用程序的输入。这意味着tiny.txt(在您的具体情况下)的内容将成为应用程序的用户输入。

答案 1 :(得分:1)

查看您提供的In类的默认构造函数,我假设StdIn只是一个默认初始化的实例。通过这个构造函数,它从stdin读取。通过将stdin重定向到文件(&lt;),您将文件的内容提供给此阅读器,这只是读取行。

要清楚,文本文件不会在args数组中提供给您的程序。那将是java Heap sort.txt。而是将标准输入流重定向为来自文件。

答案 2 :(得分:1)

你错了:

  

“StdIn.java的源代码在http://introcs.cs.princeton.edu/java/stdlib/In.java中给出。”

实际上StdIn.java的源代码是http://introcs.cs.princeton.edu/java/stdlib/StdIn.java。你看错了班级!

  

“然而,当我在命令行中传入一个文本文件作为参数时,它就像宣传的那样工作”

实际上,您不是将文本文件作为参数传递。真!

执行此操作时:

% java Heap < tiny.txt

shell正在打开文件,并将打开的文件描述符传递给Java。 Java将此文件描述符包装为java.io.InputStream对象,并通过java.lang.System.in变量使其可用于应用程序。这就是StdIn.readAllStrings()实际上正在阅读的内容。

实际上,您的Heap程序没有命令行参数。如果您在args.length方法中打印main,则会看到它为零。