Java
大约 4 分钟
Java
目录
输入输出
流
System.out / System.in
API: java.lang.System 1.0
(流的概念和C++的Stream的概念很相似)
- 标准输出流:
System.out.println
- 标准输入流:
System.in
格式化输出
printf
Java SE 5.0沿用了C语言库函数中的printf方法。用法一样
System.out.printf("%8.2f", x);
String.format
可以使用静态的String.format
方法创建一个格式化的字符串,而不打印输出
String message = String.format("Hello, %s. Next year, you'll be %d", name, age);
表
用于printf的转换符
转换符 | 类型 | 举例 |
---|---|---|
d | 十进制整数 | 159 |
x | 十六进制整数 | 9f |
o | 八进制整数 | 237 |
f | 定点浮点数 | 15.9 |
e | 指数浮点数 | 1.59e+01 |
g | 通用浮点数 | ———— |
a | 十六进制浮点数 | 0x1.fccdp3 |
s | 字符串 | Hello |
c | 字符 | H |
b | 布尔 | True |
h | 散列码 | 4268b2 |
tx 或 Tx | 日期时间 | 已经过时,应改为使用java.time 类 |
% | 百分号 | % |
n | 与平台有关的行分隔符 | ———— |
printf符的标志
标志 | 目的 | 举例 |
---|---|---|
+ | 打印正数和负数的符号 | +3333.33 |
空格 | 在正数之前添加空格 | |3333.33| |
0 | 数字前面补0 | 003333.33 |
- | 左对齐 | |3333.33| |
( | 将负数括在括号内 | (3333.33) |
, | 添加分组分隔符 | 3,333.33 |
#(f格式) | 包含小数点 | 3,333. |
#(x或0格式) | 添加前缀0x或0 | 0xcafe |
$ | 给定被格式化的参数索引。例如:%1$d, %1$x将以十进制和十六进制打印第一个参数 | 159 9F |
< | 格式化前面说的数值。例如:%d%<x以十进制和十六进制打印同一个数值 | 159 9F |
日期和时间转换符
[略],不懂
格式说明符
[略],不懂
控制台 IO
输出
直接System.out.println
就行
Scanner类
API: java.util.Scanner 5.0
import java.util.*
Scanner in = new Scanner(System.in); // 构造一个Scanner对象,并与“标准输入流”System.in关联
System.out.print("What is your name?");
String name = in.nextLine(); // 输入一行(换行符作为分隔符)
输入其他
in.next(); // 输入一个单词(空白符作为分隔符)
in.nextInt(); // 输入一个整数
in.nextDouble(); // 输入一个浮点数
Console类
API: java.io.Console 6
因为输入是可见的,所以Scanner类不适用于从控制台读取密码。Java SE 6特别引入了Console类实现这个目的
但不如采用Scanner方便。每次只能读取一行输入,而没有能够读取一个单词或一个数值的方法。
Console cons = System.console();
String username = cons.readLine("User name: ");
char[] passwd = cons.readPassword("Password: ");
文件 IO
访问文件与使用System.in和System.out一样容易,这就是抽象 “IO流” 这个概念的好处了。
简单来说就是将对多个不同IO设备的读写操作的相同的部分抽象了出来,成为了IO流
Scanner类
API: java.util.Scanner 5.0
要想对文件进行读取,就需要一个用File对象构造一个Scanner对象
Scanner in = new Scanner(Paths.get("myfile.txt"), "UTF-8");
// 如果文件名中包含反斜杠符号,就要记住在每个反斜杠之前再加一个额外的反斜杠:“c:\\mydirectory\\myfile.txt”
// 如果省略字符编码,则会使用运行这个Java程序的机器的“默认编码”
Scanner in = new Scanner("myfile.txt"); // ERROR
// 这样些的话:这个Scanner将字符串解释为数据(字符串),而不是文件名
PrintWriter类
API: java.io.PrintWriter 1.1
如果想写入文件就需要构造一个PrintWriter对象
PrintWriter out = new PrintWeiter("myfile.txt", "UTF-8");
// 如果文件不存在,创建该文件。
// 可以像输出到System.out一样使用print、println以及printf命令。
启动路径问题
API: java.nio.file.Paths 7
当指定一个相对文件名时
- 文件位于Java虚拟机==启动路径==的相对位置
- cmd:
java MyProg
时,启动路径就是命令解释器的当前路径 - 使用集成开发环境时:启动路径将由IDE控制
可以使用下面的调用方式找到路径的位置:
String dir = System.getProperty("user.dir");
读写多线程问题
要记住一点:如果用一个不存在的文件构造一个Scanner,或者用一个不能被创建的文件名构造一个PrintWriter,那么就会发生异常。Java编译器认为这些异常比“被零除”异常更严重。
已经知道有可能出现“输入/输出”异常。这需要在main方法中用throws子句标记
public static void main(String[] args) throws IOException
{
Scanner in = new Scanner(Paths.get("myfile.txt"), "UTF-8");
// ...
}