Java中的输入输出

为了增加程序的趣味性,需要程序能够接受输入,并以适当的格式输出。目前主要是需要熟悉Java程序设计语言,因此只要有
简单的用于输入输出的控制台就可以了。之后后详细地介绍GUI程序设计。

1)读取输入
要想通过控制台进行输入,首先需要构建一个Scanner对象,并与“标准输入流”System.in关联。
Scanner in = new Scanner(System.in);
现在,就可以使用Scanner类的各种方法实现输入操作了。例如,nextLine()方法将输入一行。
System.out.print("What is your name?");
String name = in.nextLine();
在这里,使用nextLine方法是因为再输入行中有可能包含空格。
要想读取一个单词(以空白符作为分隔符),就调用
String firstName = in.next();
要想读取一个整数,就调用nextInt方法。
System.out.print("How old are you? ");
int age = in.nextInt();
与此类似,要想读取下一个浮点数,就调用nextDouble方法。
下面是一个示例代码,运行结果见图1。
import java.util.*;
/*
 *This program demonstrates console input
 *@version 1 2018-06-06 
 *@author Mo9
 */
 public class InputTest
 {
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);

//get first input
System.out.print("What is your name? ");
String name = in.nextLine();

//get second input 
System.out.print("How old are you? ");
int age = in.nextInt();

//display output on console
System.out.println("Hello, " + name + ". Next year, you'll be " + (age + 1));
}

 }


图1
注释:因为输入是可见的,所以Scanner类不适用于从控制台读取密码。Java SE 6特别引入了Console类实现这个目的。
要想读取一个密码,可以采用以下代码:
Console cons = System.console();
String username = cons.readLine("User name: ");
char[] passwd = cons.readPassword("Password: ");
为了安全起见,返回的密码存放在一维字符数组中,而不是字符串中。在对密码进行处理之后,应该马上用一个填充值
覆盖数组元素。
采用Console对象处理输入不如Scanner方便。每次只能读取一行输入,而没有能够读取一个单词或一个数值的方法。

2)格式化输出

可以好使用System.out.print(x)将数值x输出到控制台上。这条命令将以x对应的数据类型所允许的最大非0数字位数打印输出x,见图2。


图2

如果希望显示美元、美分等符号,则有可能会出现问题。

在早期Java版本中,格式化数值曾引起过一些争议。庆幸的是,Java SE 5.0沿用了C语言库函数中的print方法。例如,调用
System.out.printf("%7.2f", x);

可以用7个字符的宽度和小数点后两个字符的精度打印x。也就是说,打印输出一个空格和6个字符,见图3。


图3

在printf中,可以使用多个参数例如:
System.out.printf("Hello, %s. Next year, you'll be %d", name, age);
每一个以%字符开始的格式说明符都用相应的参数替换。格式说明符尾部的转换符将指示被格式化的数值类型:f表示浮点数,
s表示字符串,d表示十进制整数。

另外,还可以给出控制格式化输出的各种标志例如,逗号标志增加分组的分隔符,见图4。


图4

注释:可以使用s转换符格式化任意的对象。对于任意实现了Formattable接口的对象都将调用formatTo方法;否则将调用
toString方法,它可以将对象转换为字符串。

可以使用静态的String.format方法创建一个格式化的字符串,而不打印输出:
String message = String.format("Hello, %s. Next year, you'll be %d", name, age);

这里简略介绍一下printf方法中日期与时间的格式化选项,见图5。


图5
如果需要多次对日期操作才能实现对每一部分进行格式化的目的就太笨拙了。为此,(1)可以采用一个格式化的字符串
指出要被格式化的参数索引,索引必须紧跟在%后面,并以$终止。(2)还可以选择使用<标志,它指示前面格式说明中的
参数被再次使用。

格式说明符的语法图,见图6。


图6


3)文件输入与输出
要想对文件进行读取,就需要一个用File对象构造一个Scanner对象,如下所示:
Scanner in = new Scanner(Paths.get("myfile.txt"));
现在,就可以利用前面介绍的任何一个Scanner方法对文件进行读取。

要想写入文件,就需要构建一个PrintWriter对象。在构造器中,只需提供文件名
PrintWriter out = new PrintWriter("myfile.txt");
如果文件不存在,创建该文件。可以像输出到System.out一样使用print、println以及printf命令。

警告:可以构建一个带有字符串参数的Scanner,但这个Scanner将字符串解释为数据,而不是文件名。例如,如果调用:
Scanner in = new Scanner("myfile.txt"); 
这个Scanner会将参数作为包含10个字符的数据,在这个示例中所显示的并不是人们所期望的效果。





猜你喜欢

转载自blog.csdn.net/m0_37732829/article/details/80626460