首页 > 编程知识 正文

java多线程,realpath函数

时间:2023-05-05 01:41:52 阅读:15059 作者:4250

Java输入一直是个漏洞,本来一直使用Scanner,但不知道换行符等,所以使用了BufferReader。 但是不久前大疆笔试需要继续输入,忘记了Scanner的写法。 那个场景在扫描仪上很好地实现了……。

让我们继续在这里记录频道的漏洞

一.下一步下一步

区分next无法获取包含空格的字符串

请务必阅读有效字符后退出。 结束条件是击中空格、制表符和enter键

nextLine可以获取空白

以回车为结束符号,即nextLine返回回车前的字符

举个例子

代码调用有两种。

类扫描仪演示{

publicstaticvoidmain (字符串[ ] args ) {

sannersc=newscanner(system.in;

int num=sc.nextInt (;

String[] str=new String[num];

for(intI=0; i num; I ) {

//str[i]=sc.next (; //str[i]=sc.nextLine (; }

sc.close (;

}

}

1. next使用案例:

输入1 :

2

abc

美国全国广播公司

结果1 :

str[0]='abc '

str[1]='cba '

原因: next ) )方法遇到有效字符之前遇到的空格、制表符和enter键都不能用作终结符。 所以读完abc再回车,存第一个,读完cba再回车,存第二个。

输入2 :

2

abc cba

efg gfe

结果2 :

str[0]='abc '

str[1]='cba '

原因: next ) )方法遇到有效字符之前遇到的空格、制表符和enter键都不能用作终结符。 所以读了abc就有空间,存第一个,读了abc就回车里存第二个。 所以,循环退出。 不是预期的' abc cba '和' efg gfe '

2. nextLine使用案例:

输入1 :

2

abc

美国全国广播公司

结果1 :

str[0]=' '

str[1]='abc '

原因:以换行符“r”为结束符,即nextLine返回到换行符“r”之前的字符。

关于“”的情况分析:

输入2时调用的是nextInt,nextInt返回结束符之前的内容,不返回结束符

我们的输入:2 r

以换行符r结束,返回2,并将换行符“r”丢弃在缓冲区中。 现在缓冲区中只有一个r。 因此,在下一次nextLine扫描中r被扫描了。 回到前面的内容,也没什么。 r删除。

关于“abc”的状况分析:

然后输入abcr。 此时,这就是缓冲区的内容

所以下一次调用nextLine时,请返回abc,r去除

输入2 :

2

ABC卡介苗

efg gfe

结果2 :

str[0]=' '

str[1]='abc bce '

“”时的分析与输入1相同

关于“abc bce”的状况分析:

第一次调用nextLine时,缓冲区为空,因此键入“abc bcfr”,第二次调用nextLine时读取r返回字符串' abc bcf '并从缓冲区中删除r

总结

总之,扫描仪是扫描仪,扫描数据是到内存中的缓冲区进行扫描,读取数据。 控制台输入的数据也保存在缓冲区中,等待扫描仪扫描读取。 该扫描仪在扫描中判断停止根据是"结束符"、空格、滑架返回、标签

坑位于next系列的函数中,即: 下一步

下一个

下一双

下一个浮动

这些函数与nextLine连用会有漏洞

基坑是指next类函数返回数据后,将换行符保留在缓冲区中。 因此,下次使用nextLine时会遇到读取空字符串的情况

解决方案:输入均为nextLine,进行格式转换

输入next系列函数调用后,中途调用一次nextLine调用以去除换行符,然后再次调用nextLine调用以输入真正的我们的数据

都使用nextLine :

类扫描仪演示{

publicstaticvoidmain (字符串[ ] args ) {

sannersc=newscanner(system.in;

intnum=integer.parseint (sc.nextline ) );

String[] str=new String[num];

for(intI=0; i num; I ) {

str[i]=sc.nextLine (;

}

sc.close (;

}

}

使用next、nextLine临时换行,将真正的数据导入nextLine :

类扫描仪演示{

publicstaticvoidmain (字符串[ ] args ) {

sannersc=newscanner(system.in;

int num=sc.nextInt (;

String[] str=new String[num];

sc.nextLine (;

for(intI=0; i num; I ) {

str[i]=sc.nextLine (;

}

sc.close (;

}

}

这两种方法都解析具有可读取空间的字符串,不读取异常的空字符串。

输入

2

abc cba

efg gfe

结果

str[0]='abc cba '

str[1]='efg gfe '

二.扫码性能

Scanner真的很晚,一直用BufferReader写,但是今天试了一下就超时了,在BufferReader度过了

毕竟,由于Scanner对输入字符实现了多种操作,所以BufferReader比较单一,读取将字节流转换为字符串后的内容

在实际测试中,BufferReader至少比Scanner输入快两倍

使用Scanner是循环输入的功能,也就是hasNext ()方法的功能

今天突然觉得可以用死循环代替,所以继续使用缓冲读取器吧。 少年! 扫码器性能推荐

class Main{

publicstaticvoidmain (字符串[ ] args ) throws IOException { )。

bufferedreaderbf=newbufferedreader (newinputstreamreader ) system.in );

while (真)。

system.out.println(BF.readline () ); //循环输入}

}

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。