输入与输出
读取输入
输出我们最常用的是System.out.println,它能将输出打印到“标准输出流”(即控制台)中,那么输入呢?相对System.out的,我们可以使用System.in来读取“标准输入流”,但是使用步骤相对于输出较为复杂一点。我们首先要构建一个与“标准输入流”System.in关联的Scanner对象(Scanner类定义在java.util包中)。
Scanner in = new Scanner(System.in);
像这样构造好Scanner对象之后,我们就可以使用Scanner类的各种方法进行输入操作了。
nextLine方法表示将读取一行输入:
System.out.println("What is your name?");
String name = in.nextLine;
注意,nextLine不会也会将空格读入进去,比如我们就不能用它来读取几个用空格分开的单词,它只会读取一整行。因此,我们可以使用另一个方法——next来输入:
String firstName = in.next();
读取一个整数有nextInt方法,读取一个浮点数有nextDouble方法(同理不做演示):
System.out.println("How old are you?");
int age = in.nextInt();
我们发散思维想一想,这种输入方式有什么缺陷呢?答案就是它的输出都是显而易见的,没有任何遮掩的,密码这样的需要隐蔽性的输入就不适合这种输入方法。那么我们还有什么办法能解决这种缺陷呢?
在Java6中提供了一个Console类来实现这个目的,想要读取密码,可以这么操作:
Console cons = System.console();
String username = cons.readLine("Username: ");
String password= cons.readPassword("Password: ");
对比Scanner,这种方式除了输入密码,实际上没有Scanner方便,它必须每次读入一行输入,而不能读取某个单词或者数值。
ScannerAPI
Scanner(InputStream in)
//用给定的输入流创建一个对象
String nextLine()
//读取输入的下一行内容
String next()
//读取输入的下一个单词(以空格作为分隔符)
int nextInt()
double nextDouble()
//读取并转换下一个整数或浮点数的字符序列
boolean hasNext()
//检测输入中是否还有其他单词
boolean hasNextInt()
boolean hasNextDouble()
//检测是否还有下一个表示整数或者浮点数的字符序列
格式化输入
其实Java也沿用了C语言的格式化输入方法printf,例如:
double x = 10000.0/3.0;
System.out,printf("%8.2f",x);
这样的含义是:打印包括一个前导空格在内的8个字符,精度为小数点后2位
3333.33
文件的输入与输出
与上面的一样,我们首先都需要构建一个Scanner对象,构造方式如下:
Scanner in = new Scanner(Path.of("hello.txt"), StandardCharsets.UTF_8);
读取一个文件时,需要知道它的字符编码,上例是UTF-8。
如果文件名包含反斜杠,需要在每个反斜杠前再加一个反斜杠进行转义:
"C:\\user\\hello.txt"
而想要写入文件,则需要构建一个PrintWriter对象。同样的,也需要在构造器中提供文件名和字符编码:
PrintWriter out = new PrintWriter("hello.txt", StandardCharsets.UTF_8);
如果文件不存在,则创建该文件。可以像输出到System.out一样使用print,println,printf命令。
当然,如果觉得相对路径定位太麻烦,我们也可以简单粗鲁的使用绝对路径,如:
"C:\\user\\hello"
注意:如果用一个不存在的文件构建一个Scanner,或者用一个无法创建的文件名构建一个PrintWriter,会产生严重异常。