文章目录

  1. 1. 异常处理改进
    1. 1.1. try-with-resources语句
    2. 1.2. 捕获多个异常
  2. 2. IO操作
    1. 2.1. Path
    2. 2.2. Files
  3. 3. 集合
    1. 3.1. 类型推断
  4. 4. 其他改动
    1. 4.1. 数字常量下划线支持
    2. 4.2. switch中使用string
    3. 4.3. 二进制字面量

在学习Java 8的最新特性之前,我们先来回顾下Java 7 曾经给我们带来了那些特性。

异常处理改进

try-with-resources语句

代码格式

try (Resource res = ...) {}

在 Java SE 7之前,可以使用 finally 块来确保资源被关闭,不管 try 语句正常地完成或是发生意外。

BufferedReader br = new BufferedReader(new FileReader(path));
try {
    return br.readLine();
} finally {
    if (br != null) br.close();
}

Java SE 7以及后续版本中,当try语句退出时,会自动调用res.close()方法。因此,使用try-with-resources语句,不管代码块如何退出,只要之前已经被创建出来,它们都会被关闭。try-with-resources语句确保在语句的最后每个资源都被关闭 。那什么样的资源有限制么?任何实现了 java.lang.AutoCloseable的对象, 包括所有实现了 java.io.Closeable的对象, 都可以用作一个资源。

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
}

可以在一个 try-with-resources 语句中声明一个或多个资源。资源的 close 方法调用顺序与它们的创建顺序相反。

try (
  ZipFile zf = new java.util.zip.ZipFile(zipFileName);
  BufferedWriter writer = Files.newBufferedWriter(outputFilePath, charset)
) {
    //TODO
}

捕获多个异常

在 Java SE 7之前,我们可能要这样做

try {
    //TODO
} catch(SQLException e) {
    logger.log(e);
} catch(IOException e) {
    logger.log(e);
}

SQLException 和IOException 这两个异常都是以相同的方式来处理的,但是你仍然要为这两个异常写两个独立的catch语句块。

try {
    //TODO
} catch(SQLException | IOException e) {
    logger.log(e);
}

注意的是,只有当捕获的异常不是其他异常的子类时,才能用这种方法。

IO操作

Path

静态方法Paths.get可以接受一个或多个字符串,然后它将这些字符串用文件系统默认的路径分割符(对于类UNIX文件系统用”/”,对于Windows系统用”\”)连接起来。

Path path1 = Paths.get("E:/Downloads/Chrome", "redis-master.zip");
System.out.println(path1.toString());
Path path2 = Paths.get("E:/Downloads", "Chrome", "redis-master.zip");
System.out.println(path2.toString());

同File对象类似,Path对象并不一定非要对应一个实际存在的文件。他只是一个文件名的抽象序列。

Files

Files类可以快速实现一些常用的文件操作。
例如,你可以很容易地读取一个文件的全部内容

Path path = Paths.get("D:/Test","file.txt");
List lines = Files.readAllLines(path, StandardCharsets.UTF_8);
System.out.println(lines);

也可以很容易写入内容

String context = "connect me -> lianggzone@163.com";
Path path = Paths.get("D:/Test","file.txt");
// 写入文件
Files.write(path, context.getBytes(StandardCharsets.UTF_8));
// 将内容追加到指定文件
Files.write(path, context.getBytes(StandardCharsets.UTF_8), StandardOpenOption.APPEND);

创建文件和目录

// 创建一个新的目录
Files.createDirectory(Paths.get("D:/Test","dir"));
// 创建新的目录(包含中间目录)
Files.createDirectories(Paths.get("D:/Test","dir1","dir2","dir3"));
// 创建新的空文件
Files.createFile(Paths.get("D:/Test","file.txt"));
// 创建临时目录
Files.createTempDirectory(Paths.get("D:/Test"), "pre-");
// 创建临时文件
Files.createTempFile(Paths.get("D:/Test"), "tmp-", ".txt");
复制和移动以及删除
Files.copy(fromPath, toPath);
Files.move(fromPath, toPath);
Files.delete(path);
Files.deleteIfExists(path);

集合

类型推断

在 Java SE 7之前,需要类型推断。

List list = new ArrayList();

Java 7后这个运算符从引用的声明中推断类型。

List list = new ArrayList<>();

其他改动

数字常量下划线支持

Long one_million = 1_000_000_000;

switch中使用string

值得注意的是,每个case是使用String的equals方法来进行比较的,对大小写敏感。

String s = "OPEN";
switch (s) {
case "OPEN":System.out.println("OPEN CHECKED!");break;
case "CLOSED":System.out.println("CLOSED CHECKED!");break;
default:System.out.println("DON'T!");break;

二进制字面量

由于继承C语言,Java代码在传统上迫使程序员只能使用十进制,八进制或十六进制来表示数(numbers)。很少的域是以bit导向的,这种限制可能导致错误。你现在可以使用0b前缀创建二进制字面量。

int binary = 0b1001_1001;
(完)

微信公众号

文章目录

  1. 1. 异常处理改进
    1. 1.1. try-with-resources语句
    2. 1.2. 捕获多个异常
  2. 2. IO操作
    1. 2.1. Path
    2. 2.2. Files
  3. 3. 集合
    1. 3.1. 类型推断
  4. 4. 其他改动
    1. 4.1. 数字常量下划线支持
    2. 4.2. switch中使用string
    3. 4.3. 二进制字面量