将字符串从java

时间:2016-11-07 10:20:05

标签: java file input command-line

我目前正在编写一个java程序,可以自动完成Android应用程序的日常工作。该程序的主要任务是通过Windows命令行运行多个外部工具,只要我不必与被调用的cmdline工具交互,它就可以正常工作。我在使用''keytool''创建密钥库时遇到问题。在执行''keytool''期间,命令行会提示我输入我的姓名,密码等。是否可以从文件中读取此信息?我不知道它是否有帮助,但这是处理命令执行的类。

private static void executeCmd(String command, PrintStream output) throws IOException, InterruptedException {
    final Runtime r = Runtime.getRuntime();
    final Process p = r.exec(command);

    java.util.List<StreamWriter> reader = Arrays.asList(
            new StreamWriter(p.getInputStream(), output).startAndGet(),
            new StreamWriter(p.getErrorStream(), output).startAndGet()
    );

    if (output != null)
        output.println("waiting for: " + command);
    p.waitFor();
    reader.forEach(StreamWriter::joinSilent);
    if (output != null)
        output.println("waiting done");
}

2 个答案:

答案 0 :(得分:1)

检查keytool -help。您可以在keytool参数中传递别名和密码。例如

keytool -list -alias TEST -keystore "C:\java\jdk\jre\lib\security\cacerts" -storepass changeit 

查看oracle的链接以获取更多示例

答案 1 :(得分:0)

您可以为命令准备输入文件并将其传递给标准输入。可以使用ProcessBuilder代替Runtime.exec

来完成
final Process process = new ProcessBuilder(command)
        .redirectInput(new File(standardInputFileName))
        .start();

但实际上,您不需要输入重定向来使用keytool。您可以将所有必需的信息作为命令行参数传递。例如,以下是生成新RSA密钥的命令行(为清晰起见,将其分为行):

keytool -genkeypair
    -keystore "<key store file>"
    -alias "<key alias>"
    -keyalg "RSA"
    -keypass "<key password>"
    -storepass "<store password>"
    -dname "<distingushed name>"

其中专有名称具有表格(为清晰起见,再次将其拆分为行)

CN=<common name>, 
OU=<orgamization unit>,
O=<organization>, 
L=<location>, 
ST=<state>,
C=<two-letter country code>

在没有用户交互的情况下生成新密钥的工作示例:

keytool -genkeypair -keystore my.store -alias my.key -keyalg RSA -storepass storage-pass -keypass key-pass -dname "CN=Nobody, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=US"

有关详情,请参阅keytool documentation page