Java命令行解析库 Argparse4j

fmms 13年前
     argparse4j 是 Python argparse 命令行解析器的 Java 语言移植版。    <p>它的主要特性:</p>    <ul>     <li>Supported positional arguments and optional arguments.</li>     <li>Variable number of arguments.</li>     <li>Generates well formatted line-wrapped help message.</li>     <li>Takes into account East Asian Width ambiguous characters when line-wrap.</li>     <li>Sub-commands like, <tt>git add</tt>.</li>     <li>Customizable option prefix characters, e.g. <tt>'+f'</tt> and <tt>'/h'</tt>.</li>     <li>Print default values in help message.</li>     <li>Choice from given collection of values.</li>     <li>Type conversion from option strings.</li>     <li>Can directly assign values into user defined classes using annotation.</li>     <li>Group arguments so that it will be printed in help message in more readable way.</li>    </ul>    <p>示例代码:</p>    <pre class="brush:java; toolbar: true; auto-links: false;">import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.ByteChannel; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException;  import net.sourceforge.argparse4j.ArgumentParsers; import net.sourceforge.argparse4j.inf.ArgumentParser; import net.sourceforge.argparse4j.inf.ArgumentParserException; import net.sourceforge.argparse4j.inf.Namespace;  public class Checksum {      public static void main(String[] args) {         ArgumentParser parser = ArgumentParsers.newArgumentParser("Checksum")                 .defaultHelp(true)                 .description("Calculate checksum of given files.");         parser.addArgument("-t", "--type")                 .choices("SHA-256", "SHA-512", "SHA1").setDefault("SHA-256")                 .help("Specify hash function to use");         parser.addArgument("file").nargs("*")                 .help("File to calculate checksum");         Namespace ns = null;         try {             ns = parser.parseArgs(args);         } catch (ArgumentParserException e) {             parser.handleError(e);             System.exit(1);         }         MessageDigest digest = null;         try {             digest = MessageDigest.getInstance(ns.getString("type"));         } catch (NoSuchAlgorithmException e) {             System.err.printf("Could not get instance of algorithm %s: %s",                     ns.getString("type"), e.getMessage());             System.exit(1);         }         for (String name : ns.                    <string>                          getList("file")) {             Path path = Paths.get(name);             try (ByteChannel channel = Files.newByteChannel(path,                     StandardOpenOption.READ);) {                 ByteBuffer buffer = ByteBuffer.allocate(4096);                 while (channel.read(buffer) > 0) {                     buffer.flip();                     digest.update(buffer);                     buffer.clear();                 }             } catch (IOException e) {                 System.err                         .printf("%s: failed to read data: %s", e.getMessage());                 continue;             }             byte md[] = digest.digest();             StringBuffer sb = new StringBuffer();             for (int i = 0, len = md.length; i < len; ++i) {                 String x = Integer.toHexString(0xff & md[i]);                 if (x.length() == 1) {                     sb.append("0");                 }                 sb.append(x);             }             System.out.printf("%s  %s\n", sb.toString(), name);         }     }  }                    </string></pre>    <p><strong>项目主页:</strong><a href="http://www.open-open.com/lib/view/home/1322613438421" target="_blank">http://www.open-open.com/lib/view/home/1322613438421</a></p>    <p></p>