java scanner.useDelimiter("\\A") 这行的作用是什么?

GOD__ 发布于 2017/10/02 22:46
阅读 2K+
收藏 0

华为云11月刊推送:DIY微信问答机器人,高性能计算代码的20个技巧!>>>

java scanner.useDelimiter("\\A") 这行的作用是什么?

加载中
1
周俊宇
周俊宇

你好:  scanner.useDelimiter命令在于设置当前scanner的分隔符,默认是空格,\\A为正则表达式,表示从字符头开始

这条语句的整体意思就是读取所有输入,包括回车换行符

解析:Scanner通过用户回车进行读取IO流,然后扫描是否有分隔符,如果没有,那么继续等待下一段IO流.

加深解析:IO流是流行的,不是一次性全部丢进去,默认Scanner使用空格分隔符,回车后扫描到第一个空格,那么就只获取IO流的第一个空格前的字符,这里我们设置了\\A,那么永远都弄不到分隔符,使用Ctrl+z  强行EOF关闭输入流,那么\\A从字符串头开始匹配,直接获取了从头到尾所有的字符.

0
guoai
guoai
\A是从字符串开头进行匹配,\Z是从字符串结尾进行匹配。这两个是不考虑行的。^是从行首,$是从行尾。
0
tcxu
tcxu

正如: 巧用Scanner将InputStream转成String 指出,"以后读取文件获取String可以参考Scanner这种操作了,nice!"

正则表达式"\\A"跟"^"的作用是一样的,代表文本的开头。
这里表示:以文本的开头作为分隔符分割文本。
如此这般,就能一下子获取整段文本的内容了,同时Scanner也在内部完成了InputStream转String的操作。
优点:节省书写代码,即不需要我们再写循环把inputStream的内容读到byte[]再放进String。

测试代码:

import java.util.Scanner;
import java.io.File ;
import java.io.InputStream ;
import java.io.FileInputStream ;
import java.io.IOException;
public class T {
public static void main(String[] args) {  
try {
    final InputStream inputStream = new FileInputStream(new File("test.txt"));

    Scanner scanner = new Scanner(inputStream, "UTF-8");
    System.out.println( scanner.useDelimiter("\\A").next());
	} catch (final IOException e) {e.printStackTrace();}
	}  
}

复制粘贴下列内容到记事本,用 "UTF-8",且保存类型为"所有文件", 文档名:“test.txt”:

只能再回去看scanner.useDelimiter()这个方法的描述,这个参数是一个pattern,原来是正则表达式。于是,继续去查正则表达式\\A代表什么,原来跟^的作用是一样的,代表文本的开头,噗。所以以文本的开头作为分隔符分割文本,就能获取整段文本的内容了,同时Scanner也在内部完成了InputStream转String的操作,节省代码不需要我们再写循环把inputStream的内容读到byte[]再放进String。

以后读取文件获取String可以参考Scanner这种骚操作了,nice!

输出:

注释:输出第一个字符‘?’是因为,所有用 “UTF-8”字符集存储的文档开头,都有一个表示这种格式/字符集的“字符”(标志)。若用其它字符集,比如 "Unicode",来存储, 就不会有这个 '?'了。

备注:

从 java 文档 Class Pattern   看出:
Boundary matchers
^    The beginning of a line
$    The end of a line
\b    A word boundary
\B    A non-word boundary
\A    The beginning of the input
\G    The end of the previous match
\Z    The end of the input but for the final terminator, if any
\z    The end of the input

 

返回顶部
顶部