输入输出
在前面的一些示例中,无论是是变量、还是其他的一些参数,都是在代码中写死了,一旦编译运行之后,就没办法修改,那有没有办法在代码执行期间,动态的输入呢?答案是可以的;
下面就讲解一下 Java 程序中的输入、输出
输入
Scanner
JDK 为我们提供了 System.in
以及 Scanner
对象,用于接收输入流并读取;
Scanner API
Scanner 的作用主要是读取用户的输入,下面介绍一下其主要的一些API
Scanner(InputStream in)
构建一个 Scanner 对象,参数是一个输入流,用户接收用户的输入;
javaScanner in = new Scanner(System.in);
nextLine()
读取用户输入的下一行
javaString nextLine = in.nextLine();
next()
读取下一个单词,以空格作为分隔符
javaString next = in.next();
hasNextInt()
监测下一个字符序列是否是整数;
javaboolean hasNextInt = in.hasNextInt(); boolean hasNextLong = in.hasNextLong();
该类型的api还有
hasNextLong()
、hasNextBoolean()
、hasNextByte()
、hasNextDouble()
等等,功能都是一样的,判断下一个字符序列的类型;nextInt()
读取并转换下一个表示为整数的字符序列;可以结合上面的
hasNextInt()
系列API先做判断,再读取;javaint nextInt = in.nextInt();
该类型的api还有
nextLong()
、nextBoolean()
、nextByte()
、nextDouble()
等等,功能都是一样的,获取并转换成指定的数据类型;
Scanner 接收示例
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("输入有误!");
}
}
}
正常输入:
请数据你的名字:一航
请数据你的年龄:18
姓名:一航 年龄:18
异常输入:
请数据你的名字:一航
请数据你的年龄:abc
输入有误!
Console
因为输入是所有人可见的,所以 Scanner 是不适合做用户名、密码的读取,此时就可以通过 Console 来读取;
API 说明
System.console()
如果有可能进行交互式操作,就通过控制台为交互的用户返回一个Console对象,否则返回的是null。对于任何一个控制台窗口启动的程序,都可以使用Console对象。否则是否可用取决于所使用的系统。
String readLine(String fmt, Object ... args)
public char[] readPassword(String fmt, Object ... args)
fmt 表示显示的提示字符,并读取用户的输入,直到输入行结束
示例:
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
输出到控制台,输出完之后,末尾会自动换行;这种方式在之前的各个示例里面经常会看到;如果涉及到多个不同的值、变量、逻辑运算的组合输出,就只能通过+
号拼接起来显示;
简单示例:
javaSystem.out.println("一行"); System.out.println("Java");
输出:
java一行 Java
拼接示例:
javaSystem.out.println("1+1=" + (1+1));
前面的"1+1="是属于字符串,会直接输出;后面的(1+1)由于是数值,会做加法运算;中间的+号会将前面的文本和后面计算的结果拼接起来输出到控制台
示例输出:
java1+1=2
System.out.print();
它的功能和System.out.println();
一样,只是内容输出完之后,末尾没有换行;
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 示例
javapublic 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