下面学习控制台的输入输出部分。
1 读入输入
注意:使用Scanner类之前得先导入这个类哈,
import java.util.Scanner;
1 先用System.in构造一个Scanner类对象。
Scanner in = new Scanner(System.in);
2 然后你就可以提示用户输入,就可以读取到了,
System.out.println("你叫什么名字?");
String name = in.nextLine();//读取一行,用户用回车确认了嘛
3 也可以读取一个单词
System.out.println("你姓什么?");
String firstName = in.next();//检测到空格了,就算输入一个单词了,本段代码不能多输入啊,会报异常的
4 也可以读取一个整型
System.out.println("你几岁啦?");
int age = in.nextInt();
5 也可以读取浮点型
System.out.println("你有多少钱?");
double money = in.nextDouble();
6 然后你就可以显示你得到的数据了
System.out.println("你好," + name + ",你姓" + firstName + ",对不对?");
System.out.println("我知道你" + age + "岁了,还知道你有" + money + "元钱。");
注意:Scanner不适合输入密码,Java有Console类比较适合输入密码。
//注意,这段代码不能在IDE里运行成功,得自己编写用系统自带的命令行才能执行
Console cons = System.console();
String username = cons.readLine("用户名:");
char[] passwd = cons.readPassword("密码:");
System.out.println("你的用户名是:" + username
+ ",你输入的密码是:"+ Arrays.toString(passwd));
Scanner类的一些没提到的方法
- boolean hasNext()
检测是否有下一个单词输入 - boolean hasNextInt()
检测是否有下一个整型输入 - boolean hasNextDouble()
检测是否有下一个浮点型输入
2 格式化输出
有一些特殊的场合,我们不满足于只是输出结果,我们想要以一定的格式来输出,那就要用到格式化输出。
格式化输出采用printf()方法。
double x= 10000.0 / 3.0;
System.out.println(x); //3333.3333333333335
System.out.printf("%8.2f", x); // 3333.33
//上面这个输出就是格式化后的结果,显示8位,小数点后保留两位
另一个例子:
String name = "AA";
int age = 5;
System.out.printf("Hello, %s, Next year, you'll be %d", name, age + 1);
每个格式化参数都以%开始,后面接不同的转换符,比如:f代表浮点数,s代表字符串,d代表整数。
具体请看下表:
转换符 | 类型 | 举例 |
---|---|---|
d | 10进制整型数字 | 159 |
x | 16进制整型数字 | 9f |
o | 8进制整型数字 | 237 |
f | 定浮点数 | 15.9 |
e | 指数浮点数 | 1.59e+01 |
g | 通用浮点数 | - |
a | 16进制浮点数 | 0x1.fxxdp3 |
s | 字符串 | Hello |
c | 字符 | H |
b | 布尔型 | true |
h | 散列码 | 42628b2 |
tx或Tx | 日期和时间 | 以后会提到 |
% | 百分号 | % |
n | 与平台有关的行分隔符 | —— |
此外,还可以用一些标识符来控制输出的形式。
标识符 | 目的 | 举例 |
---|---|---|
+ | 显示数字的正负号 | +3333.33 |
空格 | 正数前加空格 | ’ 3333.33’ |
0 | 数字前面补0 | 003333.33 |
- | 左对齐 | ‘3333.33 ‘ |
( | 把负数用小括号括起来 | (3333.33) |
, | 添加分组分隔符 | 3,333.33 |
(f) | 总是有小数点 | 3333. |
(x或o) | 添加0x或0前缀 | 0xcafe |
$ | 给定被格式化参数索引,%1$d 把第1个参数进行格式化 | 159 |
< | 格式化前面说明的数字,%d% | 159 9F |
时间的格式化输出
System.out.printf("%tc", new Date());//星期六 十一月 19 18:31:20 CST 2016
System.out.printf("%1$s %2$tB %2$te, %2$tY", "日期:", new Date());//日期: 十一月 19, 2016
下表显示了一些关于时间的格式化输出:
转换符 | 类型 | 举例 |
---|---|---|
c | 完整日期和时间 | 星期六 十一月 19 18:31:20 CST 2016 |
F | ISO 8601日期 | 2016-11-19 |
D | 美国格式日期 | 11/19/16 |
T | 24小时时间 | 18:37:37 |
r | 12小时时间 | 06:37:37 pm |
R | 24小时时间,没有秒 | 18:37 |
Y | 4位数年份,前面会补0 | 2015 |
y | 后2位年份,会补0 | 15 |
C | 前2位年份,会补0 | 20 |
B | 月份全称 | 十一月 |
b 或者 h | 简化月份 | 十一月(英文的会简化) |
m | 2位数月份,会补0 | 02 |
d | 2位数日期,会补0 | 09 |
e | 2位数日期,不补0 | 9 |
A | 完整星期名 | 星期一 |
a | 简化星期名 | 星期一(英文的会简化) |
j | 一年中的第几天,001到366 | 069 |
H | 2位数小时,会补0,24小时制 | 18 |
k | 2位数小时,不补0,24小时制 | 18 |
I | 2位数小时,会补0,12小时值 | 06 |
l | 2位数小时,不补0,12小时值 | 06 |
M | 2位数分钟,补0 | 05 |
S | 2位数秒,补0 | 19 |
L | 3位数毫秒,补0 | 047 |
N | 9位数纳秒,补0 | 047000000 |
p | 上午或下午的标记 | pm |
z | 从GMT起,RFC822数字位移 | -0800 |
Z | 时区 | PST |
s | 从格林威治时间1970-01-01 00:00:00起的秒数 | 1479553528 |
Q | 从格林威治时间1970-01-01 00:00:00起的毫秒数 | 1479553546222 |
3 文件的输入和输出
可以用Scenner类进行文件读入:
Scanner in = new Scanner(Path.get("fileName.txt"), "UTF-8");
使用PrintWriter类进行写入:
//如果文件不存在,就会创建
//你可以使用print()、println()、printf()进行写入
PrintWriter out = new PrintWriter("fileName.txt", "UTF-8");
File文件的读出写入容易引发异常,后面会有专门一章节说异常的问题。