2012-01-20 38 views
1

假设我有一个简单的程序,它采用自变量输入以下列形式
DO1 inputLocation outputLocation
DO2 inputLocation outputLocation
DO3 [30或60或90] inputLocation outputLocation一个
DO4 [PD或C] inputLocation outputLocation
DO5 [GHI] inputLocation outputLocation如何处理命令行参数中的Java

我也有5个功能与程序相同的名称,我需要调用。到目前为止,我还以为做这种方式(在“半伪”)

static void main(String[] args) 
{ 
    if (args.length == 3) 
     processTriple(args); 
    if (args.length == 4) 
     processQuadruple(args); 
    throw new UnsupportedOperationException("dasdhklasdha"); 
} 

在处理功能看起来像这样

processDouble(String args[]) 
{ 
    String operation = "args[0]"; 
    Location input = getInput(args[1]); 
    Location output = getInput(args[2]); 
    if (operation.equals("do1")) 
     do1(input,output); 
    if (operation.equals("do2")) 
     do2(input,output); 
    ... etc 
} 

我做它似乎不是很可扩展的方式。如果一个函数的参数改变了,或者添加了新的函数,看起来这样做会很痛苦。 什么是“最好”的方式去这样的事情

+0

可能重复(http://stackoverflow.com/问题/ 1200054/JAVA库换解析的命令行参数) –

回答

10

在这一点上,我会用commons-clijargs。除非你试图用参数做一些非常特别的事情,我会说专注于你的应用的真实业务,不要处理应用参数的混乱

3

使用一个commnd行解析库。看看here

2

我以前使用过JOpt Simple,效果很好。它可以让你抽象出命令行arg混乱,并保持一个非常干净的可更新参数列表。另外一个好处是它会生成标准命令行工具的帮助输出。

继承人一个简单的例子:

private void runWithArgs (String[] args) { 
    OptionParser parser = getOptionParser(); 
    OptionSet options = null; 

    try { 
     options = parser.parse (args); 
    } 
    catch (OptionException e) { 
     log.error ("Sorry the command line option(s): " + e.options() + 
        " is/are not recognized. -h for help."); 
     return; 
    } 

    if (options.has ("h")) { 
     try { 
      log.info ("Help: "); 
      parser.printHelpOn (System.out); 
     } 
     catch (IOException e) { 
      log.error ("Trying to print the help screen." + e.toString()); 
     } 
     return; 
    } 

    if (options.has ("i")) { 
     defaultHost = (String) options.valueOf ("i"); 
    } 

    if (options.has ("p")) { 
     defaultPort = (Integer) options.valueOf ("p"); 
    } 

    if (options.has ("q")) { 
     String queryString = (String) options.valueOf ("q"); 

     log.info ("Performing Query: " + queryString); 
     performQuery (queryString, defaultHost, defaultPort); 
     return; 
    } 
} 
1

我用args4j结果成功之前也是如此。

只是另一种选择。

1

您可以使用塞德里克·贝斯特的JCommander

因为生命太短解析命令行参数

我甚至创造性地违反了图书馆的原意来解析NMEA 0183这样的句子$ GPRTE如下:

import java.util.List; 

import com.beust.jcommander.Parameter; 
import com.beust.jcommander.internal.Lists; 

public class GPRTE { 
    @Parameter 
    public List<String> parameters = Lists.newArrayList(); 

    @Parameter(names = "-GPRTE", arity = 4, description = "GPRTE") 
    public List<String> gprte; 
} 

代码片断处理NMEA 0183句$ GPRTE$GPRTE,1,1,c,*37-GPRTE 1 1 c *37遵守JCommander解析语法:[?Java库,用于解析命令行参数]的

/** 
* <b>RTE</b> - route message<p> 
* Processes each <b>RTE</b> message received from the serial port in following format:<p>$GPRTE,d1,d2,d3,d4<p>Example: $GPRTE,1,1,c,*37 
* @param sequences result of {@link #Utils.process(String)} method 
* @see <a href="http://www.gpsinformation.org/dale/nmea.htm#RTE">http://www.gpsinformation.org/dale/nmea.htm#RTE<a><p>*/ 
public static void processGPRTE(final String command){ 
    final String NMEA_SENTENCE = "GPRTE"; 
    final String PARAM = "\u0001"; 
    final String DOLLAR = "\u0004"; 
    final String COMMA = "\u0005"; 

    String parsedString = command; 

    if (parsedString.contains("$"+NMEA_SENTENCE)){ 

     parsedString = parsedString.replaceAll("\\$", DOLLAR+PARAM); 
     parsedString = parsedString.replaceAll(",", COMMA); 

     System.out.println("GPRTE: " + parsedString); 

     String[] splits = parsedString.split(DOLLAR); 
     for(String info: splits){ 

      if (info.contains(PARAM+NMEA_SENTENCE)) { 
       info = info.replaceFirst(PARAM, "-"); 

       System.out.println("GPRTE info: " + info); 


       String[] args = info.split(COMMA); 

       GPRTE cmd = new GPRTE(); 
       new JCommander(cmd, processEmptyString(args)); 
       List<String> message = cmd.gprte; 

       String data1 = SerialOutils.unescape(message.get(0)); 
       System.out.println("GPRTE: data1 = " + data1); 

       String data2 = SerialOutils.unescape(message.get(1)); 
       System.out.println("GPRTE: data2 = " + data2); 

       String data3 = SerialOutils.unescape(message.get(2)); 
       System.out.println("GPRTE: data3 = " + data3); 

       String data4 = SerialOutils.unescape(message.get(3)); 
       System.out.println("GPRTE: data4 = " + data4); 

       System.out.println(""); 

      } 
     } 
    } 
}