在 Java 中解析命令行字符串可以使用以下几种方法:
1. 使用 args
参数
当程序启动时,主方法(main
方法)会接收一个 String
数组作为参数,即 args
。这些参数就是从命令行传递过来的。
示例代码:
object CommandLineParser {
@JvmStatic
fun main(args: Array<String>) {
for (arg in args) {
println(arg)
}
}
}
运行程序并传递命令行参数:
java CommandLineParser arg1 arg2 arg3
输出:
arg1
arg2
arg3
2. 使用 Apache Commons CLI
库
Apache Commons CLI
是一个专门用于解析命令行参数的库,功能强大且易于使用。
首先,添加依赖(以 Maven 为例):
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.8.0</version>
</dependency>
示例代码:
import org.apache.commons.cli.*
object CommandLineParser {
@JvmStatic
fun main(args: Array<String>) {
// 定义命令行选项
val options = Options()
options.addOption("h", "help", false, "show help")
options.addOption("v", "version", false, "show version")
options.addOption("f", "file", true, "file to process")
val parser = DefaultParser()
var cmd: CommandLine? = null
try {
cmd = parser.parse(options, args)
if (cmd!!.hasOption("h")) {
val formatter = HelpFormatter()
formatter.printHelp("CommandLineParser", options)
System.exit(0)
}
if (cmd.hasOption("v")) {
println("Version 1.0")
System.exit(0)
}
if (cmd.hasOption("f")) {
val fileName = cmd.getOptionValue("f")
println("Processing file: $fileName")
}
} catch (e: ParseException) {
println("Failed to parse command line properties")
e.printStackTrace()
}
}
}
3. 使用 JCommander
JCommander
是一个用于解析命令行参数的库,使用方便且功能强大。下面是一个详细的示例演示如何在 Java 中使用 JCommander
解析命令行参数。
添加依赖
首先,使用 Maven 添加 JCommander
库的依赖:
<dependency>
<groupId>com.beust</groupId>
<artifactId>jcommander</artifactId>
<version>1.82</version>
</dependency>
示例代码
下面是一个完整的示例代码,演示如何使用 JCommander
解析命令行参数:
import com.beust.jcommander.JCommander
import com.beust.jcommander.Parameter
import com.beust.jcommander.ParameterException
class CommandLineParser {
@Parameter(names = ["--help", "-h"], help = true, description = "display help info")
private var help = false
@Parameter(names = ["--version", "-v"], description = "display version info")
private var version = false
@Parameter(names = ["--file", "-f"], description = "files that need to be processed")
private var file: String? = null
companion object {
@JvmStatic
fun main(args: Array<String>) {
val main = CommandLineParser()
val jc = JCommander.newBuilder()
.addObject(main)
.build()
try {
jc.parse(*args)
if (main.help) {
jc.usage()
return
}
if (main.version) {
println("Version 1.0")
return
}
if (main.file != null) {
println("Processing file: " + main.file)
} else {
println("No file provided. Use -f or --file to specify a file.")
}
} catch (e: ParameterException) {
e.printStackTrace()
jc.usage()
}
}
}
}
运行程序并传递命令行参数
编译并运行程序,可以通过不同的命令行参数测试程序:
-
显示帮助信息:
java CommandLineParser -h
输出:
Usage: <main class> [options] Options: -h, --help display help info -v, --version display version info -f, --file files that need to be processed
-
显示版本信息:
java CommandLineParser -v
输出:
Version 1.0
-
处理文件:
java CommandLineParser -f myfile.txt
输出:
Processing file: myfile.txt
-
未提供文件时的提示信息:
java CommandLineParser
输出:
No file provided. Use -f or --file to specify a file.