跳至主要內容

Java

LincZero大约 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数字前面补0003333.33
-左对齐|3333.33|
(将负数括在括号内(3333.33)
,添加分组分隔符3,333.33
#(f格式)包含小数点3,333.
#(x或0格式)添加前缀0x或00xcafe
$给定被格式化的参数索引。例如:%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");
    // ...
}