Skip to content
目录概览

输入输出

在前面的一些示例中,无论是是变量、还是其他的一些参数,都是在代码中写死了,一旦编译运行之后,就没办法修改,那有没有办法在代码执行期间,动态的输入呢?答案是可以的;

下面就讲解一下 Java 程序中的输入、输出

输入

Scanner

JDK 为我们提供了 System.in 以及 Scanner 对象,用于接收输入流并读取;

Scanner API

Scanner 的作用主要是读取用户的输入,下面介绍一下其主要的一些API

  • Scanner(InputStream in)

    构建一个 Scanner 对象,参数是一个输入流,用户接收用户的输入;

    java
    Scanner in = new Scanner(System.in);
  • nextLine()

    读取用户输入的下一行

    java
    String nextLine = in.nextLine();
  • next()

    读取下一个单词,以空格作为分隔符

    java
    String next = in.next();
  • hasNextInt()

    监测下一个字符序列是否是整数;

    java
    boolean hasNextInt = in.hasNextInt();
    boolean hasNextLong = in.hasNextLong();

    该类型的api还有hasNextLong()hasNextBoolean()hasNextByte()hasNextDouble()等等,功能都是一样的,判断下一个字符序列的类型;

  • nextInt()

    读取并转换下一个表示为整数的字符序列;可以结合上面的hasNextInt()系列API先做判断,再读取;

    java
    int nextInt = in.nextInt();

    该类型的api还有nextLong()nextBoolean()nextByte()nextDouble()等等,功能都是一样的,获取并转换成指定的数据类型;

Scanner 接收示例

java
public class ScannerTest {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("请数据你的名字:");
        String name = in.nextLine();
        System.out.print("请数据你的年龄:");
        if (in.hasNextInt()) {
            int age = in.nextInt();
            System.out.println("姓名:" + name + " 年龄:" + age);
        } else {
            System.out.println("输入有误!");
        }
    }
}

正常输入:

java
请数据你的名字:一航
请数据你的年龄:18
姓名:一航 年龄:18

异常输入:

java
请数据你的名字:一航
请数据你的年龄:abc
输入有误!

Console

因为输入是所有人可见的,所以 Scanner 是不适合做用户名、密码的读取,此时就可以通过 Console 来读取;

  • API 说明

    • System.console()

      如果有可能进行交互式操作,就通过控制台为交互的用户返回一个Console对象,否则返回的是null。对于任何一个控制台窗口启动的程序,都可以使用Console对象。否则是否可用取决于所使用的系统。

    • String readLine(String fmt, Object ... args)

    • public char[] readPassword(String fmt, Object ... args)

      fmt 表示显示的提示字符,并读取用户的输入,直到输入行结束

示例:

java
public class ConsoleTest {
    public static void main(String[] args) {
        Console console = System.console();
        String userName = console.readLine("用户名:");
        char[] pwd = console.readPassword("密码:");

        System.out.println("用户名:" + userName + "密码:" + pwd);
    }
}

使用 IDEA 等根据运行以上代码时Console中将会为null。 表示Java程序无法获得Console实例,是因为JVM不是在命令行中被调用的,或者输入输出被重定向了。在诸如 IDEA 类似的IDE工具中运行Console类。如果没有对Console实例判空操作,结果使用了该实例会抛出java.lang.NullPointerException异常。只能去控制台运行这个代码或者在linux下运行。

输出

有输入,自然就有输出,Java的控制台输出主要分为三种:

  • System.out.println()
  • System.out.print()
  • System.out.printf()

System.out.println();

我们可以通过System.out.println("一行Java");,将文本一行Java输出到控制台,输出完之后,末尾会自动换行;这种方式在之前的各个示例里面经常会看到;如果涉及到多个不同的值、变量、逻辑运算的组合输出,就只能通过+号拼接起来显示;

  • 简单示例:

    java
    System.out.println("一行");
    System.out.println("Java");

    输出:

    java
    一行
    Java
  • 拼接示例:

    java
    System.out.println("1+1=" + (1+1));

    前面的"1+1="是属于字符串,会直接输出;后面的(1+1)由于是数值,会做加法运算;中间的+号会将前面的文本和后面计算的结果拼接起来输出到控制台

    示例输出:

    java
    1+1=2

System.out.print();

它的功能和System.out.println();一样,只是内容输出完之后,末尾没有换行;

java
System.out.print("一行");
System.out.print("Java");

控制台输出:

一行Java

System.out.printf()

System.out.printf()相比于与前两种方式,功能要强大很多;不仅可以输出内容,还可以对内容进行转换格式化等操作;

以下是printf()的详细使用

  • printf 转换符、占位符

    转换符说 明示 例
    %s字符串类型"mingrisoft"
    %c字符类型'm'
    %b布尔类型true
    %d整数类型(十进制)99
    %x整数类型(十六进制)FF
    %o整数类型(八进制)77
    %f浮点类型99.99
    %a十六进制浮点类型FF.35AE
    %e指数类型9.38e+5
    %g通用浮点类型(f和e类型中较短的)
    %h散列码
    %%百分比类型
    %n换行符
    %tx日期与时间类型(x代表不同的日期与时间转换符)
  • printf 标志

    标志作用示 例
    +打印正数或负数的符号-1234.568 ,+4321.988
    空格正数前面添加一个空格/ +4321.988/
    0添加前导0-001234.568 ,0004321.988
    -字段左对齐/-1234.5677 /
    (将负数包裹在()内(1234.568)
    ,添加分组分隔符-1,234.568 , 4,321.988
    #(对于f格式)总是包含一个小数点4321.
    #(对于x或0格式)添加0或者0x前缀0x100
    $指定个格式化的参数索引256 100
    <格式化前面指定的同一个值256 100 400
  • 示例

    java
    public static void t1() {
        int v1 = 256;
        float v2 = -1234.5678F;
        float v3 = 4321.987654F;
    
        System.out.printf("一行%nJava"); // 在%n的位置换行
        System.out.printf("十六进制:%x  %n", v1); // 将256 十六进制输出
        System.out.printf("十六进制:%#x 带有十六进制标志  %n", v1); // 将256 输出带有十六进制标志的整数
        System.out.printf("十进制:%d  %n", v1); // 将256 十进制输出
        System.out.printf("八进制:%o  %n", v1); // 将256 八进制输出
        System.out.printf("八进制:%#o 带有八进制标志  %n", v1); // 将256 输出带有八进制标志的整数
        System.out.printf("%s world;%s  %n", "hello", "一行Java"); // hello world;一行Java
        System.out.printf("一行%cava  %n", 'J'); // 一行Java
        System.out.printf("布尔类型:%b  %n", true); // 布尔类型:true
        System.out.printf("十六进制浮点类型:%a  %n", v2); // 十六进制浮点类型:0x1.34a456p10
        System.out.printf("指数类型:%e  %n", v2); // 十六进制浮点类型:0x1.34a456p10
        System.out.printf("通用浮点类型:%g  %n", v2); // 通用浮点类型:1234.57
        System.out.printf("散列码:%h  %n", v2); // 通用浮点类型:1234.57
        System.out.printf("百分比:%d%%  %n%n", 30); // 百分比:30%  单个%会报错
    
        System.out.println(">>>>>>>>>>>日期格式化>>>>>>>>>>>>>>>>>>>");
        Date date = new Date();
        //c的使用
        System.out.printf("全部日期和时间信息:%tc  %n", date);
        //全部日期和时间信息:星期二 三月 09 03:20:34 CST 2021
        //f的用法
        System.out.printf("年-月-日格式:%tF   %n", date);
        //年-月-日格式:2021-03-09
        //d的用法
        System.out.printf("月/日/年格式:%tD   %n", date);
        //月/日/年格式:03/09/21
        //r的使用
        System.out.printf("HH:MM:SS PM格式(12时制):%tr  %n", date);
        //HH:MM:SS PM格式(12时制):03:20:34 上午
        //t的使用
        System.out.printf("HH:MM:SS格式(24时制):%tT  %n", date);
        //HH:MM:SS格式(24时制):03:20:34
        //R的使用
        System.out.printf("HH:MM格式(24时制):%tR  %n", date);
        //HH:MM格式(24时制):03:20
        System.out.printf("<<<<<<<<<<<日期格式化<<<<<<<<<<<<<<<<<<< %n%n");
    
    
        System.out.printf("%f |%f  %n", v2, v3);// "f"表示格式化输出浮点数。
        System.out.printf("%9.2f |%9.2f  %n", v2, v3);// "9.2"中的9表示输出的长度,2表示小数点后的位数。
        System.out.printf("%+9.2f |%+9.2f  %n", v2, v3);// "+"表示输出的数带正负号。
        System.out.printf("%-9.4f |%-9.4f  %n", v2, v3);// "-"表示输出的数左对齐(默认为右对齐)。
        System.out.printf("%+-9.3f |%+-9.3f  %n", v2, v3);// "+-"表示输出的数带正负号且左对齐。
        System.out.printf("%011.3f |%011.3f  %n", v2, v3);// "0"表示输出的长度不够,通过补0填充。
        System.out.printf("%(11.3f |%(11.3f  %n", v2, v3);// "("表示输出将负数包裹在括号内。
        System.out.printf("% 11.3f |% 11.3f  %n", v2, v3);// " "表示输出前后添加一个空格。
        System.out.printf("%,11.3f |%,11.3f  %n", v2, v3);// ","表示输出添加分组分隔符。
        System.out.printf("%1$d %1$x |%2$d %2$x  %n", 256, 80);// "$"表示格式化的参数索引;1$表示第一个参数 2$表示第二个参数...
        System.out.printf("%d %<x %<o  |%d %<x %<o  %n", 256, 80);// "<"表示格式化前面的同一个值,%x %<o %<d 将一个值分别按十进制、十六进制、八进制输出
    }

    执行输出:

    java
    一行
    Java 
    十六进制:100  
    十六进制:0x100 带有十六进制标志  
    十进制:256  
    八进制:400  
    八进制:0400 带有八进制标志  
    hello world;一行Java  
    一行Java  
    布尔类型:true  
    十六进制浮点类型:-0x1.34a456p10  
    指数类型:-1.234568e+03  
    通用浮点类型:-1234.57  
    散列码:c49a522b  
    百分比:30%  
    
    >>>>>>>>>>>日期格式化>>>>>>>>>>>>>>>>>>>
    全部日期和时间信息:周三 10月 05 23:20:46 CST 2022  
    --日格式:2022-10-05   
    //年格式:10/05/22   
    HH:MM:SS PM格式(12时制):11:20:46 下午  
    HH:MM:SS格式(24时制):23:20:46  
    HH:MM格式(24时制):23:20  
    <<<<<<<<<<<日期格式化<<<<<<<<<<<<<<<<<<< 
    
    -1234.567749 |4321.987793  
     -1234.57 |  4321.99  
     -1234.57 | +4321.99  
    -1234.5677 |4321.9878  
    -1234.568 |+4321.988  
    -001234.568 |0004321.988  
     (1234.568) |   4321.988  
      -1234.568 |   4321.988  
     -1,234.568 |  4,321.988  
    256 100 |80 50  
    256 100 400  |80 50 120  
    
    Process finished with exit code 0