美文网首页
Java 输入输出 Scanner

Java 输入输出 Scanner

作者: 交大小丑 | 来源:发表于2020-03-16 07:49 被阅读0次

    一、Java输入

    输入输出的简述:System.in. ,Scanner, BufferReder
    在命令行模式下要输入数据至程序中时,我们可以使用标准输入串对象System.in.但是,我们并不经常直接使用它,因为System.in提供的 read方法每次只能读取一个字节的数据,而我们平时所应用的通常是读取一个字符串或者是一个数字,所以read方法所以提供的功能,对我们来说并没有太 大的用处.

    1.1 System.in.

    System.in是一个很原始、很简陋的输入流对象,通常不直接使用它来读取用户的输入。
    一般会在外面封装过滤流:
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    然后调用br.readLine()方法进行读取。

    System.in.read()可以实现输入字符,返回字符的Unicode码,但是缺点是只能输入一个字符
    System.in.read() 返回的是输入数值的 ASKII 码(一个 int 整数)。 如果要求输入与输出的一致的话: 通常情况下,你会用readLine( )一行一行地读取输入,因此要把System.in包装成BufferedReader。但在这之前还得先用InputSteamReader把System.in转换成Reader。

    1.2 Scanner 类

    在Java SE 6中,可以使用Scanner类取得用户的输入,Scanner类位于java.util包中,如果你要使用Scanner取得用户输入的话,要加上 import java.util.Scanner;这条语句.import的功能是告诉编译器,你将使用java.util包中的Scanner类.
    new是创建一个对象,程序中new的意思是创建了一个Scanner类的对象scan.但是在创建Scanner类的对象时,需要用System.in 作为它的参数,也可以将Scanner看作是System.in对象的支持者,System.in取得用户输入的内容后,交给Scanner来作一些处 理.
    我们来看一个例子:

    import java.util.Scanner;
      public class TestScanner{
          public static void main(String[] args){ 
                Scanner scan = new Scanner(System.in);
                System.out.println("请输入一个字符串:");
                System.out.println("您输入的字符串是:" + scan.next());
          }
      }
    

    1.2.1 Scanner类用法详解

    hasNextXxx() 判断是否还有下一个输入项,其中Xxx可以是Int,Double等。如果需要判断是否包含下一个字符串,则可以省略Xxx
    nextXxx() 获取下一个输入项。Xxx的含义和上个方法中的Xxx相同。

    1.2.1.1 Scanner类 next 方法:

    image.png

    其实上图的意思就是,比如:nextlnt():只读取int值,就是只能读取整数类型的数据,如果输入了非整型的数据(浮点型字符串等)就会报错。
    nextFloat()、nextDouble()这些也是以此类推,只能读取符合该类型的数据。

            next():取得一个字符串;
            nextInt():将取得的字符串转换成int类型的整数;
            nextFloat():将取得的字符串转换成float型;
            nextBoolean():将取得的字符串转换成boolean型; 
    

    此处重点讲一下next()和nextLine()的区别

    next():只读取输入直到空格。它不能读两个由空格或符号隔开的单词。此外,next()在读取输入后将光标放在同一行中。(next()只读空格之前的数据,并且光标指向本行)
    nextLine():读取输入,包括单词之间的空格和除回车以外的所有符号(即。它读到行尾)。读取输入后,nextLine()将光标定位在下一行。
    nextInt(): it only reads the int value, nextInt() places the cursor(光标) in the same line after reading the input.(nextInt()只读取数值,剩下"\n"还没有读取,并将Scanner类读取依靠的cursor放在数值后面,"\n"前面,因此如果用nextInt()读取后,再用nextLine()读取,读取到的是换行符)
      next(): read the input only till the space. It can’t read two words separated by space. Also, next() places the cursor in the same line after reading the input.(next()只读空格之前的数据,并且cursor指向本行)next() 方法遇见第一个有效字符(非空格,非换行符)时,开始扫描,当遇见第一个分隔符或结束符(空格或换行符)时,结束扫描,获取扫描到的内容,即获得第一个扫描到的不含空格、换行符的单个字符串。
      nextLine(): reads input including space between the words (that is, it reads till the end of line \n). Once the input is read, nextLine() positions the cursor in the next line.nextLine()时,则可以扫描到一行内容并作为一个字符串而被获取到。如果要读取带空格的一串字符串还是需要使用nextLine(),而非next()方法。
    如果使用next()、nextDouble() 、 nextFloat()、nextInt() 读取后,其实还有一个回车未读取出来,若此时后面跟上一个nextLine()读取的是该回车。碰到nextLine()若Scanner中确实没有东西可以读取,会等待你输入。

    public class Text {
        public static void main(String []args) {
            Scanner input = new Scanner(System.in);
            System.out.println("请输入一个字符串(中间能加空格或符号)");
            String a = input.nextLine();
            System.out.println("请输入一个字符串(中间不能加空格或符号)");
            String b = input.next();
            System.out.println("请输入一个整数");
            int c;
            c = input.nextInt();
            System.out.println("请输入一个double类型的小数");
            double d = input.nextDouble();
            System.out.println("请输入一个float类型的小数");
            float f = input.nextFloat();
            System.out.println("按顺序输出abcdf的值:");
            System.out.println(a);
            System.out.println(b);
            System.out.println(c);
            System.out.println(d);
            System.out.println(f);
        }
    }
    
    请输入一个字符串(中间能加空格或符号)
    我爱祖国!
    请输入一个字符串(中间不能加空格或符号)
    ILoveChina
    请输入一个整数
    520
    请输入一个double类型的小数
    12.26e3
    请输入一个float类型的小数
    3.1415926
    按顺序输出abcdf的值:
    我爱祖国!
    ILoveChina
    520
    12260.0
    3.1415925
    

    Java的Scanner的nextLine()方法的结束条件的设置

    可以通过判断读入的行是否是空行来决定是否跳出循环,比如
    Scanner sc=new Scanner(System.in);
    String s;
    while(sc.hasNextLine()){
    s=sc.nextLine();
    if(s.equals("") break;

    //do something

    }
      注意while循环的条件sc.hasNextLine()不要写成sc.hasNext()。

    这样,在读到空行的时候就会退出循环,结束输入,也比较符合常用的使用场景。

    1.2.1.1 Scanner类 hasnext 方法:

    image.png

    1.2.2 Scanner类实现源码详解

    《Scanner的hasNext、hasNextInt用法》Scanner,hasNext乌鸦大大-CSDN博客 https://blog.csdn.net/weixin_41262453/article/details/88815173

    nextLine 与hasnextline注意事项

    next()nextLine()以及nextInt()的区别及用法
    next()nextLine()以及nextInt()的区别及用法_唐志强的博客-CSDN博客 https://blog.csdn.net/m0_37695351/article/details/79254221

    1.3 BufferReader 类

    用Scanner获得用户的输入非常的方便,但是Scanner取得输入的依据是空格符,包括空格键,Tab键和Enter键.当按下这其中的任一键 时,Scanner就会返回下一个输入. 当你输入的内容中间包括空格时,显然,使用Scanner就不能完整的获得你输入的字符串.这时候我们可以考虑使 用BufferedReader类取得输入.其实在Java SE 1.4及以前的版本中,尚没有提供Scanner方法,我们获得输入时也是使用BufferReader的.

    BufferedReader类位于java.io包中,所以要使用这个类,就要引入java.io这个包:import java.io.BufferedReader.
    使用BufferedReader对象的readLine()方法必须处理java.io.IOException异常(Exception).
    使用BufferedReader来取得输入,理解起来要复杂得多.但是使用这个方法是固定的,每次使用前先如法炮制就可以了.

    BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
    String text = buffer.readLine(); 
    

    readLine()方法会返回用户在按下Enter键之前的所有字符输入,不包括最后按下的Enter返回字符.
    完整的示例程序如下:

    import java.io.BufferedReader;
        public class TestBufferedReader{
             public static void main(String[] args) throws IOException{
                  BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
                  System.out.println("请输入一串字符串");
                  String text = buffer.readLine();
                  System.out.println("您输入的字符串是:" + text);
             }
        }
    

    1.4 Scanner和BufferedReader的区别和用法

    Scanner和BufferedReader的区别和用法

    二、Java输出

    2.1 System 类

    System.out.print(a);//输出变量a的值
    System.out.print("214214");//输出字符串
    System.out.print("123"+a);//混合输出字符串和变量值
    /*
    当然也可以使用System.out.println();表示换行输出,相当于System.out.print("\n");
      其中System是一个类,out是java.io.PrintStream的对象,也就是System这个类中含有java.io.PrintStream的对象out。
    
      print()是java.io.PrintStream类里的一个方法,也就是out对象的一个方法。
    
    */
    
    2.1.1 System.out 详解

    在Java编程中,我们常常用 System.out.println(); 来输出字符串,也许我们都已经猜到println()是方法名,但System是什么,out又是什么呢?
    其实System是java.lang里面的一个类如下图:

    image

    而out就是System里面的一个静态数据成员,而且这个成员是java.io.PrintStream类的引用。如下图,被关键字static修饰的成员可以直接通过"类名.成员名"来引用,而无需创建类的实例。所以System.out是调用了System类的静态数据成员out


    image.png

    println()就是java.io.PrintStream类里的一个方法,它的作用是向控制台输出信息。因为System.out是java.io.PrintStream类的实例的引用,所以可以通过 System.out.println(); 来调用此方法。

    image

    相关文章

      网友评论

          本文标题:Java 输入输出 Scanner

          本文链接:https://www.haomeiwen.com/subject/lrmxactx.html