簡體   English   中英

在Linux中將Psql與Java一起使用以導入SQL文件

[英]Using psql in linux with java to import a sql file

我正在使用這種方法將命令發送到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本地主機-p 5432 -U postgres -d測試-f test.sql

我在終端上手動鍵入了此命令,它可以正常工作,但不能與上述方法配合使用(該方法與date,ls一起使用效果很好)

調用psql時,方法條目看起來像是一個無限循環。 當該方法調用psql時,該方法不會結束。

ps:我使用export PGPASSWORD = pass避免通過密碼。

我認為您的問題可能是您嘗試順序使用輸入流和錯誤流,而實際上必須同時執行它們。 因此,您的第一個readLine調用正在阻塞,等待readLine在另一個流上完成。

您可以通過使用多個線程讀取流,重定向stderr或僅放棄所有輸出來解決此問題。 看一下這些線程:

我解決了使用創建文件file.sh的問題

導出PGPASSWORD = pass

psql -h ip -p端口-U用戶-d databaseName -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(); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM