要明确:这个问题不是关于如何解析程序的参数,如公共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);
}
编辑:明确表示我不会寻找另一个解析库的参数。
答案 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)。
请注意流中的错误处理可能非常糟糕。