【问题标题】:Java: Create a command from String arrayJava:从字符串数组创建命令
【发布时间】:2014-03-26 15:30:31
【问题描述】:

我有一个字符串数组,其中包含一个单独的命令 - 每个参数位于不同的单元格中。

我想要一个获取字符串数组并使用它来准备语义合法的完整命令的方法(即处理特殊字符,例如<space>、大括号等)。然后,它应该将完整的命令作为一个字符串返回

这是我想要使用的一个非常简单的示例(如果我有createCommand() 方法):

String[] cmdParts = {"ls", "-l", "/tmp /home"};
String cmd = createCommand(cmdParts);

在上面的例子中,我希望cmd 包含字符串ls -l "/tmp /home"

有没有一种方法可以做到这一点,或者类似的东西?

【问题讨论】:

  • 要判断它是否合法,你需要执行它。
  • 也许我遗漏了一些东西,但是,您似乎要求连接字符串。
  • 我在这里写了一个非常简单的场景。该函数应该比字符串连接器更聪明。例如,如果其中一个参数包含<space>braces 或者谁知道还有什么,该函数可能需要添加转义字符、更多大括号等。
  • 对不起,用户3322273直言不讳,但我们不会为您编码。例如,转义字符串中的引号。您可以搜索并找到答案。请尝试这样做,并使用提供的建议,然后回复您可能遇到的问题(如果有)。
  • 我不希望任何人为我编写代码。我想使用标准解决方案。所以我的实际问题是你是否知道一个包含类似方法的库(比如 apache 的东西)

标签: java shell cmd escaping exec


【解决方案1】:

您可以循环遍历数组并自己轻松完成。我什么都想不出来

String createCommand(String[] cmdParts) {

  StringBuilder sb = new StringBuilder()
  for(String cmdPart : cmdParts) {
    if (sb.length() > 0) {
      sb.append(" ");
    }
    sb.append(cmdPart);
  }
  return sb.toString();
}

虽然它不会给您留下尾随或前导空格。

另请注意:

{"ls", "-l", "/tmp /home"}

不会导致

ls -l "/tmp /home"

您需要将转义的引号添加到最后一个字符串。

{"ls", "-l", "\"/tmp /home\""}

【讨论】:

  • 我正在寻找一种可以自动添加这些转义引号的方法
  • 你怎么知道 "ls" 和 "-l" 不需要引号,但 "/tmp /home" 需要?
  • 当我将它作为一个包含<space> 的字符串传递给函数时,我会知道它。为了使 Unix 将多个以空格分隔的字符串视为一个参数,您应该将它们插入引号
【解决方案2】:

如果这是您的意思,您可以连接字符串。并将它放在一个方法 createCommand 中,该方法获取一个字符串数组作为输入并输出一个连接的字符串:

public String createCommand(String[] parts)
{
   String result = "";
   for(String part : parts)
   {
      result = result + part + " "; \\concatenates the result string with the next string in your parts array.
   }

   return result; 
}

【讨论】:

  • 谢谢,但这不是我需要的。在主线程中查看我的回复。它应该处理特殊字符,例如<space>、大括号等。
【解决方案3】:

如果您出于各种原因使用 StringBuilder 将是最好的。无论如何,编译器可能会将您的方法转换为 StringBuilder,但您不想依赖它。 Effective Java 的第 51 条很好地说明了为什么在这种情况下应该使用 StringBuilder。

至于实际的方法,你会做这样的事情,但就像你说的,你将不得不在 for 循环中引入逻辑来处理转义特定字符等等。

public String createCommand(String[] cmdParts) {
    StringBuilder newCommand = new StringBuilder();
    for(String s : cmdParts) {
        newCommand.append(s).append(" ");
    }
    return newCommand.toString();
}

【讨论】:

  • P.S.查看 String.format() 方法,因为它可以帮助您在 for 循环中添加逻辑。
【解决方案4】:

如果你有java8,你可以使用以下代码:

public static void main(String[] args) { String[] cmdParts = {"ls", "-l", "/tmp /home"}; String cmd = String.join(" ", cmdParts); System.out.println(cmd); }

更简单。如果你没有java8,你可以使用别人的代码。

【讨论】:

  • 它会处理特殊字符吗?如果是,这听起来是一个很好的解决方案。如果我使用 Java 7,也许有一些 apache 或其他一些 lib 做同样的事情?
  • Java8 没问题,特殊字符不用管。
猜你喜欢
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多