Java Scanner使用的注意事项

Java Scanner使用的注意事项1Scanner读取数据的问题Scanner是一个扫描器,我们录取到键盘的数据,先存到缓存区等待读取,其次当我们通过以下方法将缓存的数据读取时,next()方法读取到空白符就结束l;nextLine()读取到回车结束也就是“\r”;举个例子1:importjava.util.Scanner;publicclassTest{publicstaticvoidmain(String[]args){Scannerscan=newScanne

大家好,欢迎来到IT知识分享网。

1 Scanner读取数据的问题

Scanner是一个扫描器,我们录取到键盘的数据,先存到缓存区等待读取,其次当我们通过以下方法将缓存的数据读取时,

  • next()方法读取到空白符就结束l;
  • nextLine()读取到回车结束也就是“\r”;

举个例子1:

import java.util.Scanner;

public class Test { 
   
    public static void main(String[] args) { 
   
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入内容(next)"); // 输入"aaa bbbb ccc"
        System.out.println(scan.next()); // 输出aaa

        System.out.println("请输入内容(nextLine)");
        System.out.println(scan.nextLine()); //输出" bbbb ccc"
    }
}

最终输出

请输入内容(next)
aaa bbbb    ccc
aaa
请输入内容(nextLine)
 bbbb    ccc

分析:

  • 输入"aaa bbbb ccc\r\n"之后,这段字符串保存在了缓存中。
  • next方法以空格为分隔符,因此只读到aaa。并且注意没有把截至符(即分隔符的空格读取)
  • 由于Scanner缓存区内还有数据,因此当再次执行nextLine方法时,会直接从缓存区读取数据而无需等待用户输入。nextLine此时读取以回车换行符为分隔符,所以直接读完到ccc(注意bbbb前面的一个空格也被读取了,但是同样截至符回车没有被读取)。

举个例子2:将上面一段程序的第二个读取换成next。通过之前的分析不难得出,第二次读取的应该只是"bbbb"

public class Test { 
   
    public static void main(String[] args) { 
   
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入内容(next)");
        System.out.println(scan.next());

        System.out.println("请输入内容(next)");
        System.out.println(scan.next());
    }
}

输出结果:

请输入内容(next)
aaa bbbb    ccc
aaa
请输入内容(next)
bbbb

注意:第二次打印的时候并没有把bbbb之前的空格打印上。我们此时可以猜测:每一种打印方法都会自动把起始的截至符过滤掉。比如next方法就不会读取一开始的空格,nextLine方法不会读取一开始的回车换行符号。

为了验证上述猜想,我们再做第三个例子。


举个例子3:通过文件读取,观察两次nextLine的结果。
文件内容:

aa  a

bb bbb

cc
public class Test { 
   
    public static void main(String[] args) throws FileNotFoundException { 
   
        Scanner scan = new Scanner(new FileInputStream(new File("E:\\a.txt")));
        System.out.println(scan.nextLine());
        System.out.println(scan.nextLine());
        System.out.println(scan.nextLine());
    }
}

输出结果:

aa  a

bb bbb

可以发现,nextLine方法就是读一行,即使这一行只有一个换行符也同样打印出来。

总结:

  • next方法忽略开始的所有的分隔符,读取到正常文本后直到遇到分隔符结束读取。
  • nextLine方法就是读取一行,只要读到换行符就返回。
  • 不管哪种方法,都不会把最后的分隔符读进来。即:next方法返回的字符串结尾没有空格,nextLine方法返回的字符串结尾没有换行符。

2 如何正确Socket信息传输:正确的读与写

  • 如果用Scanner接收命令行字符串,根据上面的描述,字符串结尾一定不包括分隔符(即空格或换行符)。为了保证读取socket数据时候可以正确读到(通过Scanner的nextLine方法或者BufferedReader的readLine方法),这时候最好的办法是通过PrintStream的println方法自动追加换行符将数据写入socket。
  • 不要用Scanner的next方法读取socket数据。因为next只能读取到空格。如果命令行输入的消息中含有空格,就不能完整读取和发送了。就像下面这样:
    在这里插入图片描述
    总结:
  • 写入socket用PrintStream的println方法。
  • 读取socket用Scanner的nextLine方法或者BufferedReader的readLine方法。

3 BufferedReader和Scanner的差异

1、Scanner提供了一系列nextXxx()方法,当我们确定输入的数据类型时,使用Scanner更加方便。也正是因为这个BufferedReader相对于Scanner来说要快一点,因为Scanner对输入数据进行类解析,而BufferedReader只是简单地读取字符序列。

2、Scanner和BufferedReader都设置了缓冲区,Scanner有很少的缓冲区(1KB字符缓冲)相对于BufferedReader(8KB字节缓冲),但是这是绰绰有余的。

3、BufferedReader是支持同步的,而Scanner不支持。如果我们处理多线程程序,BufferedReader应当使用。

4、Scanner输入的一个问题:在Scanner类中如果我们在任何7个nextXXX()方法之后调用nextLine()方法,这nextLine()方法不能够从控制台读取任何内容,并且,这游标不会进入控制台,它将跳过这一步。nextXXX()方法包括nextInt(),nextFloat(), nextByte(),nextShort(),nextDouble(),nextLong(),next()。在BufferReader类中就没有那种问题。这种问题仅仅出现在Scanner类中,由于nextXXX()方法忽略换行符,但是nextLine()并不忽略它。如果我们在nextXXX()方法和nextLine()方法之间使用超过一个以上的nextLine()方法,这个问题将不会出现了;因为nextLine()把换行符消耗了。

————————————————

版权声明:本章(第3章)为CSDN博主「知行流浪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zengxiantao1994/article/details/78056243

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/22635.html

(0)
上一篇 2023-12-27 19:00
下一篇 2023-12-28 22:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信