URL,Scanner和Delimiter:这段Java代码是如何工作的?

7

有人能帮我理解这行代码是如何工作的吗:

String s = new Scanner(new URL("http://example.com").openStream(), "UTF-8").useDelimiter("\\A").next();

这段代码被用来从网页直接读取内容。 如何将扫描器对象转换为字符串,以及为什么要使用分隔符,这些问题需要详细阐述。

谢谢。


2
它不是“转换”的。next()方法返回一个String。请查看Scanner的JavaDoc。useDelimiter也在那里描述了。 - Fildor
3个回答

15

这是发生的事情,滥用缩进

     new Scanner(                           // A new scanner is created
             new URL("http://example.com")  // the scanner takes a Stream 
                                            // which is obtained from a URL
          .openStream(),                    // - openStream returns the stream
       "UTF-8")                             // Now the scanner can parse the        
                                            // stream character by character
                                            // with UTF-8 encoding

     .useDelimiter("\\A")                   // Now the scanner set as 
                                            // delimiter the [Regexp for \A][1]
                                            // \A stands for :start of a string!

   .next();                                 // Here it returns the first(next) 
                                            // token that is before another
                                            // start of string. 
                                            // Which, I'm not sure 
                                            // what it will be

来自Java文档

一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。 扫描器使用分隔符模式将其输入分成标记,默认情况下匹配空格。然后,可以使用各种next方法将结果标记转换为不同类型的值。

因此,您只需将\A替换为分隔符(而不是空格)。 但是,当作为正则表达式进行评估时,\A有特定的含义!

如果您的流仅包含以下文本

\Ahello world!\A Goodbye!\A

您的代码将返回整行\Ahello world!\A Goodbye!\A

如果您想要剥离反斜杠后跟大写字母A的序列,则应使用\\\\A

感谢@Faux Pas指出这一点!


3

补充Kuzeko的回答,\A匹配整个文本的开头。因此,我不认为他的“hello world”示例是有效的。


你的意思是它会返回空字符串作为第一个吗? - Kuzeko

2

Scanner没有被“转换”。在新创建的实例上,调用useDelimiter方法,返回一个已设置分隔符属性的Scanner实例,然后在该实例上调用next方法,返回一个String

您可能需要查阅Java Doc中有关Scanner的更多信息: https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接