1

我正在使用这种方法向linux终端发送命令

public static String execute(String command) {
    StringBuilder sb = new StringBuilder();
    String[] commands = new String[]{"/bin/sh", "-c", command};
    try {
        Process proc = new ProcessBuilder(commands).start();
        BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
        BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream()));

        String s = null;
        while ((s = stdInput.readLine()) != null) {
            sb.append(s);
            sb.append("\n");
        }

        while ((s = stdError.readLine()) != null) {
            sb.append(s);
            sb.append("\n");
        } 
    } catch (IOException e) {
        e.printStackTrace(); 
    }
    return sb.toString();
}   

它适用于许多命令,如“ls”、“date”等。

但我想使用 psql 命令将 sql 文件导入 postgre,例如:

psql -h localhost -p 5432 -U postgres -d test -f test.sql

我在终端中手动输入了这个命令,它工作正常,但不适用于上述方法(该方法适用于日期,ls ...)

当它调用 psql 时,它看起来像是一种无限循环中的方法条目。当方法调用 psql 时,方法不会结束。

ps:我使用export PGPASSWORD=pass来避免传递密码。

4

2 回答 2

1

我认为您的问题可能是您试图按顺序使用输入和错误流,而实际上您必须同时执行它们。因此,您的第一个readLine呼叫被阻塞,等待readLine在另一个流上完成。

您可以通过使用多个线程来读取流,或通过重定向 stderr,或仅放弃所有输出来解决此问题。看看这些线程:

于 2013-08-13T17:10:38.573 回答
0

我解决了创建文件 file.sh 的问题

导出 PGPASSWORD=通过

psql -h ip -p 端口 -U 用户 -d 数据库名 -f sqlFilePath

取消设置 PGPASSWORD

然后我使用方法执行:

execute("chmod +x file.sh"); //to give permission to file execute

execute ("./file.sh") //to execute the file in terminal

最后我删除了file.sh

File file = new File("file.sh"); 
file.delete(); 
于 2013-08-14T13:09:51.403 回答