【发布时间】:2016-03-09 01:05:56
【问题描述】:
我编写了许多从命令行获取信息的 java 工具,java 提供通过main(args[]) 访问这些信息。有问题的应用程序通常是 Windows 工具(因此从命令行或批处理文件运行)。
根据我从痛苦经历中学到的知识,Windows 会根据实际调用的参数数据对参数数据进行自己的(有时是古怪的)转换和转换。然后将其转交给 Java,Java 进行自己的解析和处理,最终为您呈现args[]。正是这种多层次的解析\预处理目前让我很伤心,因为并不总是清楚事情在哪里被破坏了。
我的第一个问题是,Java 在获取 args 之前实际上做了什么实际的解析\转换?据我所知,它只接受操作系统提供的参数数据(我理解它只是一个长字符串),并根据空格(制表符、空格字符)对其进行分隔。就这么简单吗?
第二个问题,是否可以获得未处理的命令行数据,因为它被传递给Java?虽然将 args 用空格分隔通常很方便,但当您开始添加更复杂的排列时,它就会分崩离析。所以"-foo=bar" 最终可能会变成"-foo=" "bar",或"-foo" "=" "bar",或"-foo" "=bar",这取决于白色空间风的吹动方式。如果我在第一个问题中所做的假设是正确的,那么您可以通过在 args 中的每个元素之间插入一个空格来构建一个字符串,但如果完成了其他处理,那么访问原始 args 会变得更加有用。
作为最后一点,我知道已经有许多可用的库可以处理 Java 中的命令行数据。我可能应该在某个时候开始使用其中之一,但现在我只想了解正在做什么,以及 Java 本身提供了哪些替代方案(如果有的话)。
【问题讨论】:
-
"在到达 args 之前,Java 实际做了什么解析\转换" 无。你得到你的shell传递的任何东西。
-
So "-foo=bar" might end up as "-foo=" "bar", or "-foo" "=" "bar", or "-foo" "=bar"- 您是否有一个工作示例证明-foo=bar在args[]中作为"-foo=bar"以外的任何其他内容传递?
标签: java command-line-arguments