用库

时间:2015-11-30 13:11:12

标签: java unix

要明确:这个问题不是关于如何解析程序的参数,如公共CLI / JCommando等。

我想用Java编写Unix命令。虽然我不想自己编写大部分内容,但我打算使用库并寻求帮助。

我找到了用于解析参数的公共cli,比如getopt。 但是我正在寻找像Perl的钻石运算符或Python的fileinput-library一样工作的最后一个库。

作为unix命令(或者我来自Linux的GNU命令)的工作原理是,在解析任何标志之后,剩下的任何参数都被认为是文件。然后,该命令逐行循环遍历这些文件,逐个文件。 dubble dash(例如git checkout - myfile.txt)用于将文件名与参数分开。如果在解析所有参数后没有剩下任何参数,则程序应该从标准读取。

这就是Perl的钻石操作符以及Python的fileinput库,只有极少数几行:

的Perl

@ARGV = ("diamond.pl", "stdin.pl");
while (<>) {
    print();
}

的Python

import fileinput
for line in fileinput.input():
    process(line)

Java中是否有一个库可以像它们那样简单地执行这些操作(基本上与https://docs.python.org/2/library/fileinput.html具有相同API的库)?我不想自己编写这些东西(查找参数,如果不是通过stdin循环,否则加载每个文件,最好是懒惰,将每行输入命令等)...我只想要业务结束,循环如下:

我的想法

LineIterator li = new MagicTextLineFeeder(remainingAfterCommonsCliParsing);
for (String line : li.nextRow()) {
    System.out.println(line);
}

编辑:明确表示我不会寻找另一个解析库的参数。

1 个答案:

答案 0 :(得分:1)

啊 - Java 8的乐趣:

http://howtodoinjava.com/2014/05/04/read-file-line-by-line-in-java-8-streams-of-lines-example/

private static void readStreamOfLinesUsingFiles() throws IOException
{
    Stream<String> lines = Files.lines(Paths.get("c:/temp", "data.txt"));
    Optional<String> hasPassword = lines.filter(s -> s.contains("password")).findFirst();
    if(hasPassword.isPresent()){
        System.out.println(hasPassword.get());
    }
    //Close the stream and it's underlying file as well
    lines.close();
}

将此与Stream.of()(传递需要省略号的数组)和flatMap相结合,您就得到了所需内容(详见this)。

请注意流中的错误处理可能非常糟糕。