2017-10-16 167 views
0

我有一個關於Scanner及其從System.in輸入的方式的具體問題。Java多行掃描儀輸入

我想要做什麼:我需要讀取從System.in給出的單個輸入。問題是這個輸入可能有多行(輸入可能有多個\n字符)。

我的嘗試:

我嘗試的明顯的一點就是Scanner.nextLine()方法,但ofcourse,這不會讀取所有數據。我想接下來的事情是這樣的:

Scanner sc = new Scanner(System.in); 
List<String> data = new ArrayList<>(); 

while(sc.hasNextLine()){ 
    String line = sc.nextLine(); 
    if(line.isEmpty()){ 
     break; 
    } 
    data.add(line); 
} 

但是,這也將跳過大量的數據 - 例如,當在給定的文本中間的空行。

我也嘗試刪除break;聲明,並希望while(sc.hasNextLine())循環會自行破壞,但這絕不會發生,因爲掃描器將等待數據。

這可以在Java中完成嗎?感謝您的時間

+0

循環_will_自行破裂。你只需要給它一個行尾的字符。 – Sweeper

+0

也許這是一個解決方案? https://stackoverflow.com/a/42429171/3959856 –

回答

0

如果您在Windows上按OS +或Ctrl + D上的Command + D,則會插入行尾字符。

當掃描器到達行尾字符時,hasNextLine將返回false並且循環將終止。

所以刪除此:

if(line.isEmpty()){ 
    break; 
} 

和你多行輸入後鍵入行字符的結尾。

或者,如果允許這樣做,您可以將輸入作爲字符串輸入到掃描儀。例如,如果你想輸入該輸入:

Hello World 
This is a 
Multiline 
input 

您可以初始化這樣的掃描儀:

Scanner line = new Scanner("Hello World\n" + 
     "This is a\n" + 
     "Multiline\n" + 
     "input"); 

或者你可以把你輸入到一個文件,讓掃描儀讀取:

Scanner line = new Scanner(new File("path to your input file")); 
0

使用這種類型的閱讀

String read = ""; 
    Scanner sc = new Scanner(System.in); 
    String line; 
    while (sc.hasNextLine()) { 
     line = sc.nextLine(); 
     if (line.isEmpty()) { 
      break; 
     } 
     read += line + "\n"; 
    } 
    System.out.println(read); 

在這裏,首先我們檢查nextline是否存在。如果是,則使用sc.nextLine()方法讀取數據,如果讀取的數據是空白的,則斷開循環。

0

如果您想要將多條線上的所有輸入讀入一個字符串列表,每個輸入行一個元素,那麼用戶必須指出輸入何時結束。這通常通過使用文件結束符來完成:在Windows命令提示符下,它是Ctrl-Z,並且在所有平臺上的Linux,OS X和IntelliJ IDE輸入窗口上,它都是Ctrl-D。

您可以用下面的代碼讀取行:

Scanner sc = new Scanner(System.in); 
List<String> data = sc.tokens().collect(Collectors.toList());