2012-03-18 155 views
1

使用java.util.Scanner實例,是否有可能返回所有剩餘的內容?我的情景是,一旦我閱讀了String中的許多字段,我只想獲得剩下的東西並將其存儲在其他地方。例如我的內容可能包括:java.util.Scanner讀取剩餘內容

1,2,Some Garbage with \' special characters and so on 

我將構建使用,作爲分隔符掃描儀,調用getInt()兩次,然後想"Some Garbage with \' special characters and so on"回一個電話。

回答

2

有沒有「好」的方式與Scanner做到這一點。您可以嘗試 String next(Pattern pattern)傳遞給它圖案像$

Pattern p = Pattern.compile("$", Pattern.MULTILINE);

我還沒有試過,但它可能會工作。當輸入中有多行時,請不要忘記檢查它。

但是我認爲更好的方法就是使用循環中的普通read(byte[])方法從包裝輸入流中讀取。這是因爲掃描儀沒有按照原樣讀取流。有人閱讀單獨的字段。它做得很好。在你的情況下,你只是想讀「blob」,所以只需使用有效載荷流來讀取它。

+0

這不起作用(引發異常);我還沒有能夠構造一個實例,其中使用行定位符'$'作爲模式的唯一組成部分,實際上是'Scanner.next(...)'工作。它不適用於空字符串,例如:'new Scanner(「」)。next(「$」)'。 – 2018-01-15 19:27:12

2

由於AlexR's answer points,應該更好地閱讀原始流 - 但在我的情況下,它被消耗,不能被收購。

Scannerto read 'all': \\A中有一個特殊字符/分隔符。所以如果你想要掃描儀的其餘部分,你可以改變它:

scanner.useDelimiter("\\A"); 
String content = scanner.hasNext() ? scanner.next() : null; 
+0

'\ A'不是一個特殊的分隔符「來讀取」全部「。它是一個正則表達式行錨,通常與'^'匹配(匹配字符串的開頭),已設置_unless_「多行模式」('Pattern.compile(...)'中的'Pattern.MULTILINE'):然後'^'在換行符後匹配,'\ A'仍然匹配字符串的開頭。有鑑於此,您的代碼所做的工作就是將分隔符設置爲零寬度的字符串開頭字符串,該字符串不會匹配任何位置,因此它將在調用'scanner.next()'時返回字符串的其餘部分(通常'next()'在匹配的分隔符之前停止)。然而,它是_does_工作。 – 2018-01-15 18:45:55