参考自–《Java核心技术卷1》
输入输出
1 读取输入
打印输出“标准输出流” System.out
到控制台窗口是十分容易的,只需要调用 System.out.println
即可。然而,读取“标准输出流” System.in
却没那么简单。
要想通过控制台进行输入,首先要构建一个 Scanner 对象,并与“标准输入流” System.in
关联:
Scanner in = new Scanner(System.in);
然后就可以使用 Scanner 类的各种方法实现输入操作:
如:使用 nextLine
方法读取一行输入(包括空格):
String s = in.nextLine();
如:使用 next
方法读取一个单词(以空白符作为分隔符):
String s = in.next();
如:使用 nextInt
读取一个整数:
int n = in.nextInt();
与此类似,要想读取下一个浮点数,就调用 nextDouble
方法。
注:Scanner 类定义在 java.util
包里,使用 Scanner 类读取 标准输入流 前需加载该包:
import java.util.Scanner;
其他方法:
- boolean hasNext() 检测输入中是否还有其他单词
- boolean hasNextInt() 检测是否还有表示整数的下一个字符序列
- boolean hasNextDouble() 检测是否还有表示浮点数的下一个字符序列
2 格式化输出
可以使用 System.out.print(x)
将数值 x 输出到控制台。这条命令将以 x 对应的数据类型所允许的最大非0数字位数打印输出 x。例如:
double x = 10000.0/3.0;
System.out.print(x); //输出 3333.3333333333335
格式化输出沿用了 C 语言库函数中的 printf
方法:
System.out.printf("%8.2f",x); //输出 3333.33(注前面带有一个空格)
即用8个字符的宽度和小数点后两个字符的精度打印 x(即一个空格加7个字符)。
在 printf
中。可以使用多个参数:
System.out.printf("My name id %s,and I am %d years old",name,age);
每一个以 % 字符开始的格式说明符都用相应的参数替换。格式说明符尾部的转换符将指示被格式化的数值类型:
此外,还可以给出控制格式化输出的各种标志:
//使用分组的分隔符(分隔符可更换为其他符号)
System.out.printf("%,.2f",10000.0/3.0); //输出结果 3,333.33
//打印正数和负数的符号
System.out.printf("%+.2f",10000.0/3.0); //输出结果 +3333.33
其他标志: 0 在数字前面补0;- 左对齐;( 将数字括起来 等等。
注:可以使用静态方法 String.format
创建一个格式化的字符串,而不打印输出:
String msg = String.format("My name id %s,and I am %d years old",name,age);
注:日期和时间的格式化:
System.out.printf("%tc",new Date()); //打印当前日期和时间
//星期五 四月 03 17:01:16 CST 2020
// %tT 24小时时间(%tr 不带秒)
// %tr 12小时时间
// %tF ISO 8601时间 年-月-日
// 等等
3 文件输入和输出
想要对文件进行读取,就需要一个用 File 对象构造的 Scanner 对象,如下:
Scanner in = new Scanner(Paths.get("url"),"UTF-8"); // url为读取的文件路径 UTF-8为编码格式
然后就可以使用 Scanner 的各种方法对文件进行读取了。如:
// 一行一行读取并打印,直至读取完全部内容
while (in.hasNext()){
String str = in.nextLine();
System.out.println(str);
}
想要写入文件,就需要构造一个 PrintWrite 对象。在构造器中,只需要提供文件名:
PrintWriter out = new PrintWrite("url","UTF-8"); //url为写入文件的路径
// 此处的 “url” 也可以是一个 File 对象
如果对应的文件不存在,则创建该文件。
写入(可以使用 print 、println 、printf 命令):
out.println("c123");
out.println(12);
out.close(); //最后需要关闭写入
注:如果用一个不存在的文件构造一个 Scanner 或者用一个不能被创建的文件名构造一个 PrintWrite,那么就会发生异常。Java编译器认为这些异常比“被零除”异常更严重。需要做抛出异常throw 或者 try catch 语句处理。