有人能帮我理解这行代码是如何工作的吗:
String s = new Scanner(new URL("http://example.com").openStream(), "UTF-8").useDelimiter("\\A").next();
这段代码被用来从网页直接读取内容。 如何将扫描器对象转换为字符串,以及为什么要使用分隔符,这些问题需要详细阐述。
谢谢。
有人能帮我理解这行代码是如何工作的吗:
String s = new Scanner(new URL("http://example.com").openStream(), "UTF-8").useDelimiter("\\A").next();
这段代码被用来从网页直接读取内容。 如何将扫描器对象转换为字符串,以及为什么要使用分隔符,这些问题需要详细阐述。
谢谢。
这是发生的事情,滥用缩进
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
一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。 扫描器使用分隔符模式将其输入分成标记,默认情况下匹配空格。然后,可以使用各种next方法将结果标记转换为不同类型的值。
因此,您只需将\A
替换为分隔符(而不是空格)。
但是,当作为正则表达式进行评估时,\A
有特定的含义!
如果您的流仅包含以下文本
\Ahello world!\A Goodbye!\A
您的代码将返回整行\Ahello world!\A Goodbye!\A
如果您想要剥离反斜杠后跟大写字母A的序列,则应使用\\\\A
。
感谢@Faux Pas指出这一点!
补充Kuzeko的回答,\A匹配整个文本的开头。因此,我不认为他的“hello world”示例是有效的。
Scanner没有被“转换”。在新创建的实例上,调用useDelimiter
方法,返回一个已设置分隔符属性的Scanner实例,然后在该实例上调用next
方法,返回一个String
。
您可能需要查阅Java Doc中有关Scanner的更多信息: https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html
next()
方法返回一个String
。请查看Scanner的JavaDoc。useDelimiter也在那里描述了。 - Fildor