当前位置: 首页 > 知识库问答 >
问题:

使用库编写java unix命令

谭修竹
2023-03-14

需要明确的是:这个问题不是关于如何像commons CLI/JCommando等那样解析程序的参数。

我想用Java编写Unix命令。虽然我不想自己写大部分东西,但我打算使用图书馆,并寻求您的帮助。

我找到了用于解析参数的commons cli,比如getopt。然而,我正在寻找一个类似Perl的diamond运算符或Python的fileinput库的最后一个库。

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

这是Perl的diamond运算符和Python的fileinput库在非常少的几行上所做的:

Perl

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

python

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

Java中是否有一个库可以像它们一样简单地完成它们所做的事情(一个库基本上具有与之相同的API)https://docs.python.org/2/library/fileinput.html)? 我不想自己写这些东西(寻找参数,如果不循环stdin,则加载每个文件,最好是lazy,将每行输入命令等等)。。。我只想要业务端,循环如下:

我的主意

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

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

共有1个答案

梁烨
2023-03-14

啊——Java的快乐:

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();
}

将其与流相结合。of()(传递一个需要省略号的数组)和flatMap,您就得到了所需的内容(有关详细信息,请参见此)。

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

 类似资料:
  • 在保存composer.phar文件的目录中,我无法执行任何作曲家命令。 当我执行时,我可以看到作曲家正在运行 但是任何直接的作曲家陈述都失败了。 不确定这是否重要,但Composer包含在克隆存储库中。 我只想安装一个Oauth库,然后可能几个月内不会再接触Composer,所以我不需要在全球范围内运行它。我只是不明白为什么我不能从这个目录中运行作曲家。

  • 我是Android开发人员和计算机视觉工程师。 我正在Mac上用OpenCV做一个计算机视觉项目,用Xcode编写OS X10.9.5,它是跨平台的,所以我所做的是命令行编译到linux并访问它(服务器)。 我遇到的问题是无法识别库。我用: /home/ec2-user/project/utils.cpp:2475:未定义对`JSON::Value::Value(JSON::ValueType)'

  • 在gdb中,你不用必须输入完整的命令,只需命令的(前)几个字母即可。规则是,只要这个缩写不会和其它命令有歧义(注,是否有歧义,这个规则从文档上看不出,看起来需要查看gdb的源代码,或者在实际使用中进行总结)。也可以使用tab键进行命令补全。 其中许多常用命令只使用第一个字母就可以,比如: b -> break c -> continue d -> delete f -> frame i -> in

  • 主要内容:SDKMAN!,创建和运行第一个程序,hello.kt,运行 REPL(交互式解释器),使用命令行执行脚本Kotlin 命令行编译工具下载地址:https://github.com/JetBrains/kotlin/releases/tag/v1.1.2-2,目前最新为 1.1.2-2。 你可以选择一个最新的稳定版下载。 下载完成后,解压到指定目录,然后将 bin 目录添加到系统环境变量。bin 目录包含编译和运行 Kotlin 所需的脚本。 SDKMAN! 在 OS X、Linux、

  • Kotlin 命令行编译工具下载地址:https://github.com/JetBrains/kotlin/releases/tag/v1.1.2-2,目前最新为 1.1.2-2。 你可以选择一个最新的稳定版下载。 下载完成后,解压到指定目录,然后将 bin 目录添加到系统环境变量。bin 目录包含编译和运行 Kotlin 所需的脚本。 SDKMAN! 在 OS X、Linux、Cygwin、F

  • 我正在编写一个向Android手机发送通知的反应式api。发送通知的过程需要从手机访问令牌代码以将消息推送给它。为了实现这一点,我在服务器端创建了一个endpoint来接收来自手机的令牌。我的问题是保存令牌,然后在上面描述的过程中使用它。这是TokenController、TokenService、TokenRepository和Token POJO: 为了发送通知,我有一个通知控制器,需要访问数