Java在Linux環境下執行MySQL命令無法獲取結果的問題
背景
最近專案中包含一些匯出功能,一些功能需要多表查詢才可以滿足需求,也有一些資料僅是單表查詢。在此之前想到過兩種方案,第一種是查詢出資料後通過EasyExcle寫入檔案,另一種是使用MySQL自帶的匯出功能。但在嘗試第二種方案時遇到一些問題,記錄如下。
問題
在執行單表匯出的過程中,我使用了MySQL自帶的命令完成。即在程式碼中通過字串拼接命令。例如:
即便是這條語句通過Java程式呼叫還是會執行失敗。失敗的原因有兩個:
- 通過Java程式碼呼叫命令會出現程式卡死,導致後面的程式無法執行,需要手動處理
- 命令是字串,需要告訴作業系統這並非字串而是命令
解決
import java.io.*;
/**
* @description:
* @author: 582895699@qq.com
* @time: 2020/11/26 下午 11:17
*/
public class Test {
public static void main(String[] args) {
executeCommand();
}
public static void executeCommand() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("mysql -uroot -proot -D test -e 'select * from goods where id=1'");
stringBuilder.append(" > ");
stringBuilder.append("/tmp/20201128.csv");
// 告訴作業系統並非字串,而是命令
String[] command = {"/bin/bash", "-c", stringBuilder.toString()};
try {
Process process = Runtime.getRuntime().exec(command);
printMessage(process.getInputStream());
printMessage(process.getErrorStream());
// 等待命令執行完畢
process.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
/**
* 另起一個執行緒輸出錯誤流
*
* @param input
*/
private static void printMessage(final InputStream input) {
new Thread(() -> {
Reader reader = new InputStreamReader(input);
BufferedReader bf = new BufferedReader(reader);
String line = null;
try {
while ((line = bf.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
如有問題,歡迎指正
原文地址:https://www.haicheng.website/passages/execute-command-on-linux/
相關文章
- linux執行環境&命令Linux
- 獲取任務的執行結果
- Java獲取多執行緒執行結果方式的歸納與總結Java執行緒
- Jmeter Arrivals thread group 在命令列執行時,無法生成測試結果JMeterthread命令列
- Windows下Pycharm執行命令列語句結果亂碼問題��Ȩ��Ӧ��WindowsPyCharm命令列
- 簡單安裝PHP在Linux下的執行環境PHPLinux
- python執行shell並獲取結果Python
- victoriaMetrics無法獲取抓取target的問題
- 在Windows環境下使用NodeJS的fast-glob不正確執行的問題WindowsNodeJSAST
- 【Spark】 Spark作業執行原理--獲取執行結果Spark
- Linux下無法執行Color pickerLinux
- Linux 環境下 PHP 專案基礎執行環境搭建(PHP 7.3.6 + MySQL 8.0.16 + Nginx)LinuxPHPMySqlNginx
- Mac環境下MySQL無法啟動的處理方法MacMySql
- node express 在使用mysql執行SELECT count(*) from xx獲取總數取值格式問題ExpressMySql
- 解決SSH遠端執行命令找不到環境變數的問題變數
- Java指令重排序在多執行緒環境下的應對策略Java排序執行緒
- 在Ubuntu環境下用gcc命令執行c程式以及Makefile編譯UbuntuGCC程式編譯
- vscode在Linux環境下執行“許可權不夠”的解決方法VSCodeLinux
- linux下配置java環境LinuxJava
- Linux伺服器準備java執行環境Linux伺服器Java
- 在 Ubuntu 環境下 Qt Creator 無法使用搜狗輸入法UbuntuQT
- Docker+Jenkins+Pipline如何獲取git外掛環境變數(提交sha、分支等)以及Jenkinsfile中獲取sh執行結果(獲取git最近提交資訊)DockerJenkinsGit變數
- 多執行緒的補充 獲取一定時間的執行結果執行緒
- 解決 Python 指令碼無法生成結果的問題Python指令碼
- .NET 4.0 環境下無法直接執行 .NET 2.0 程式的問題,當然目前解決了 (轉載--來於園中)...
- 今天在linux上用perl連線sqlserver,執行儲存過程,獲取一個結果集LinuxSQLServer儲存過程
- springboot:使用非同步註解@Async獲取執行結果的坑Spring Boot非同步
- Linux下Java環境安裝LinuxJava
- 純終端Linux環境或者無掛載顯示卡Linux環境執行Chrome例項LinuxChrome
- eclipse環境下無法建立android virtual Devices(AVD)問題解決的方法彙總EclipseAndroiddev
- js執行環境總結JS
- c# 多執行緒環境下控制對共享資源訪問的辦法C#執行緒
- Java002-執行環境Java
- Android 14 CTS 測試無法執行的問題?Android
- Linux下Java環境變數的配置LinuxJava變數
- 【PyCharm】解決虛擬環境pip無法使用問題PyCharm
- win下clion打包的.exe檔案在無執行環境的電腦執行顯示缺失各種.dll
- Linux/Go環境搭建, HelloWorld執行LinuxGo