2012-03-18 79 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