Java
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");
    // ...
}链接到当前文件 0
没有文件链接到当前文件