import java.util.Scanner;
/**
*cover:
*System类中的in属性
*Scanner扫描器 读取控制台输入的内容
*Scanner类中nextLine()方法的应用
*查看所在包名类名的方法
*代码连续写法,判断最终接收类型的方法
*流、扫描器用后记得关闭和关闭时间节点分析
*异常java.util.NoSuchElementException: No line found产生原因分析
*/
/**
* alt+/调出此方法中定义的属性供选择 ctrl+/单行注释 ctrl+shift+/多行注释 ctrl+shift+F文本对齐
* 编辑器会提示流用完要关闭,输出流由于是System类的静态变量,System.out.close()直接关闭即可,输入流in由于是扫描器封装的,关闭扫描器既关闭输入流,注意关闭的时间节点。
* @author FFrog
* */
public class InputCode {
public static void main(String[] args){
/*按住Alt+单击in,in在System类中是这样定义的:public final static InputStream in = null;
同样Scanner在Scanner类是这样定义的:public final class Scanner implements Iterator<String>, Closeable{},Closeable接口抛出了一个异常。
Scanner类没有static修饰,需要实例化。
这里说明一下InputStream输入流需要用扫描器封装的原因:
InputStream实际上是以字节为单位来获取数据,而且需要复杂的判断并创建字节数组作为缓冲,字节转成字符时也容易出现乱码,所以字符数据读取的时候用扫描器封装获得字符串类型的数据。
*/
Scanner scan = new Scanner(System.in);
/*可以看到scan里面是一串数据包:是java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0]
[match valid=false][need input=false][source closed=false][skipped=false]
[group separator=\,][decimal separator=\.][positive prefix=][negative prefix=\Q-\E]
[positive suffix=][negative suffix=][NaN string=\Q�\E][infinity string=\Q∞\E]*/
System.out.println("scan里面是:"+scan);
System.out.print("请输入:");
String str = scan.nextLine();
System.out.println("您输入的是"+str);
/*联续的.属性.方法,我猜返回值是String类型,测试一下
注:因为直接用最终类型接收的,编辑器会提示 Resource leak: '<unassigned Closeable value>' is never closed*/
System.out.println("返回类型是,所在类class:"+new Scanner(System.in).nextLine().getClass());
//知道 返回类型了,用String类型的变量接收一下
String str2 = new Scanner(System.in).nextLine();
System.out.print("请再次输入:");
System.out.println("您输入的是:"+str2);
//scan.close();
/*由于这时你已经关闭了扫描器,就监听不到控制台你输入的内容
* Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Unknown Source)
at com.kyxh.javaweb.example.InputCode.main(InputCode.java:23)*/
System.out.println("第三次输入:");
System.out.println("所在类class:"+new Scanner(System.in).nextLine().getClass());
System.out.println("类名:"+new Scanner(System.in).nextLine().getClass().getName());
//所在包:package java.lang, Java Platform API Specification, version 1.7
System.out.println("所在包信息:"+new Scanner(System.in).nextLine().getClass().getPackage());
//包名是:java.lang
System.out.println("包名是:"+new Scanner(System.in).nextLine().getClass().getPackage().getName());
//所在类class:class java.lang.String
System.out.println("所在类class:"+str2.getClass());
//包名是:java.lang
System.out.println("包名是:"+str2.getClass().getPackage().getName());
//类名是:java.lang.String
System.out.println("类名是:"+str2.getClass().getName());
//如果此时关闭输出流,则无法执行下一个方法
//System.out.close();
InputCode ic = new InputCode();
ic.checkIDcardLength(str);
/*checkIDcardLength(str)关闭了扫描器,里面的数据包也就没了,无法执行checkIDcardLength2(str2),
也会出现异常:java.util.NoSuchElementException: No line found。*/
InputCode.checkIDcardLength2(str2);
}
private String checkIDcardLength(String str){
Scanner sc = new java.util.Scanner(System.in);
System.out.println("进来了。。。");
System.out.println("请输入身份证号:");
String result = sc.nextLine();
System.out.println("原来你的身份证号是"+result.length()+"位数的啊!");
//sc.close();
return str;
}
private static String checkIDcardLength2(String str2){
Scanner sc2 = new java.util.Scanner(System.in);
System.out.println("进来静态方法了。。。");
System.out.println("请输入身份证号:");
String result2 = sc2.nextLine();
System.out.println("原来你的身份证号是"+result2.length()+"位数的啊!");
sc2.close();
return str2;
}
}
System类中的in属性 Scanner扫描器 读取控制台输入的内容 Scanner类中nextLine()方法的应用 查看所在包名类名的方法 代码连续写法,判断最终接收类型的方法
于 2022-03-25 23:58:27 首次发布