【问题标题】:java.util.Scanner read remaining contentjava.util.Scanner 读取剩余内容
【发布时间】:2012-03-18 09:08:07
【问题描述】:

使用java.util.Scanner 实例,它是否可以返回所有剩余的内容?我的情况是,一旦我读取了String 中的多个字段,我只想获取剩下的任何内容并将其存储在其他地方。例如,我的内容可能包括:

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

我会使用, 作为分隔符来构建扫描器,调用getInt() 两次,然后想在一次调用中返回"Some Garbage with \' special characters and so on"

【问题讨论】:

    标签: java java.util.scanner


    【解决方案1】:

    作为AlexR's answer points,阅读原始流应该更好 - 但在我的情况下,它已被消耗并且无法读取。

    Scannerto read 'all': \\A 中有一个特殊字符/分隔符。所以如果你想要扫描仪的其余部分,你可以改变它:

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

    【讨论】:

    • \A不是“读取'全部'”的特殊分隔符。它是一个正则表达式行锚,通常行为与^(匹配字符串开头)相同,除非“多行模式”已设置(Pattern.compile(...) 中的Pattern.MULTILINE):然后@987654331 @ 匹配换行符之后,\A 仍然匹配字符串的开头。鉴于此,您的代码所做的是将分隔符设置为在任何地方都不匹配的零宽度字符串开头锚点,因此它在调用 scanner.next() 时返回字符串的其余部分(通常为 next()在匹配的分隔符之前停止)。但是,它确实有效。
    【解决方案2】:

    使用 Scanner 没有“好的”方法可以做到这一点。你可以试试 String next(Pattern pattern) 传递给它 multiline 模式,如 $:

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

    我还没有尝试过,但它可能会起作用。当您的输入中剩余几行时,请不要忘记检查它。

    但是我认为更好的方法是在循环中使用普通的read(byte[]) 方法从包装的输入流中读取。这是因为 Scanner 没有照原样读取流。它负责阅读单独的字段。它做得很好。在您的情况下,您只想阅读“blob”,因此只需使用有效负载流读取它。

    【讨论】:

    • 这不起作用(抛出异常);我无法构建一个实例,其中使用线锚$ 作为Scanner.next(...) 模式的唯一组成部分实际上确实 工作。它不适用于空字符串,例如:new Scanner("").next("$")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    相关资源
    最近更新 更多