【问题标题】:Standard input in Java vs command lineJava中的标准输入与命令行
【发布时间】:2021-05-11 11:28:26
【问题描述】:

虽然操作系统中的每个命令行进程都可能使用标准输入、标准输出和标准错误数据流,但我对命令行参数和标准输入感到困惑。

也许我的理解不正确。但在我看来,除了命令行之外,标准输入是另一种将数据输入程序的方式。如果您能帮助我理解其中的区别,我将不胜感激。

提前致谢。

【问题讨论】:

  • 命令行参数是主函数的参数。标准输入可以是从 CLI 传输的键盘或文件流。
  • System.in 是标准输入,通常是控制台。 System.out 是标准输出。 System.err 是标准错误。

标签: java stream operating-system


【解决方案1】:

考虑到处理 Java 的标准输入与任何其他程序没有区别(至少在 Linux 下)。 JVM 中的标准输入继承自父级的标准输入。和“命令行”不是同一个概念。

考虑一下 Linux 中的someProg arg1 arg2 <file:标准输入是命名文件,而不是命令行。

所有进程都从命令行开始;在这种情况下,它包含someProg arg1 arg2。当进程开始时,命令行已经设置好了;从启动过程的角度来看,就是这样。

相比之下,标准输入是一个输入文件(由描述符标识),程序可以根据需要从中读取输入。默认情况下它是控制台,但如图所示,父进程(在本例中为 shell)可以重定向它(在本例中,从名为 file 的文件中读取)。

关于用 Java 编程需要注意的一点是,正在运行的程序实际上是 Java(JVM)本身。一些命令行用于 JVM,其他部分用于用 Java 编写的程序。 Java 文档会区分这两者。

【讨论】:

  • 谢谢。那么我可以假设整个命令行(如“java -jar MyProg.jar”)实际上是shell的标准输入吗?是shell解析命令行并将程序(这里是java)作为另一个进程启动吗?
【解决方案2】:

可以在执行时将一些值从命令行传递给 C 程序。这些值称为命令行参数,很多时候它们对您的程序很重要,尤其是当您想从外部控制程序而不是在代码中硬编码这些值时。

命令行参数使用 main() 函数参数处理,其中 argc 是指传递的参数数量(主要是整数),而 argv[] 是一个指针数组,它指向传递给程序的每个参数(字符数组/主要是字符串)。下面是一个简单的例子,它检查是否有从命令行提供的任何参数并采取相应的措施

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-13
    • 2014-02-02
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 2013-04-06
    相关资源
    最近更新 更多