2017-03-15 62 views
-1

我正在編寫一個程序,可以接受「.sql」文件或接受stdin中的SQL語句。問題來自stdin:Java從stdin中接受一(1)行多行字符串

Scanner scanner = new Scanner(new BufferedInputStream(System.in)); 
System.out.println("Enter SQL statements"); 
StringBuilder stringBuilder = new StringBuilder(); 
while (scanner.hasNext()) { 
    stringBuilder = stringBuilder.append(scanner.nextLine()).append("\n"); 
} 
sqlQuery=stringBuilder.toString(); 

它從答案here修改。但是,當我將語句輸入或粘貼到終端中時,它不會進入下一步,而是語句會繼續追加"\n"。我希望用戶輸入在enter(類似於this problem,但使用Java)時結束。我該怎麼做?

+0

那麼檢查用戶是否輸入了空字符串? – SLaks

回答

1

收集所有的輸入直到一個雙新行(空行),你可以在Scanner設置自定義分隔符,使用正則表達式,它會收集與輸入到scanner.next()一個電話。

Scanner scanner = new Scanner(System.in); 

System.out.println("Enter SQL statements"); 

scanner.useDelimiter("\n\n"); // an empty line 
String sqlQuery = scanner.next(); 
scanner.reset(); // resets the delimiter 
1

你存在的代碼預計,輸入將通過與該Scanner相關聯,而不是由單條線的端部的流結束時終止 - 請參見scanner.nextLine()調用如何是while循環內?

如果你想只讀一行,那麼擺脫循環。而且,如果你不連接多行,那麼你也不需要StringBuilder。但是,確保這是你想要的,因爲SQL語句以多行格式編寫是相對常見的。

+0

注意:文本模式SQL接口通常接受多行輸入。它們通常會尋找某種分隔符來識別查詢的結束,例如單獨一行的句號或分號。 –

+0

但是一些sql語句由多個命令組成,比如多表插入或創建視圖然後從中提取數據 –

+0

@DylanChensky,多個命令不是問題,因爲您可以順序輸入它們。 Multiline *個人*命令是一個不同的問題,如果你想支持這些,那麼你就有一個根本性的問題:程序應該如何將一條給定的行識別爲命令中的最後一行,而期待追加的行呢?在我之前的評論中,我已經說了一兩句話。 –