固然我们开始了Java8的路程,可是许多人直接从java6上手了java8, 也许有一些JDK7的特性你还不知道,在本章节中带你回首一下我们健忘了的那些特性。 尽量我们不能讲所有特性都讲一遍,挑出常用的焦点特性拎出来一起进修。
异常改造
try-with-resources
这个特性是在JDK7种呈现的,我们在之前操纵一个流工具的时候或许是这样的:
try { // 利用流工具 stream.read(); stream.write(); } catch(Exception e){ // 处理惩罚异常 } finally { // 封锁流资源 if(stream != null){ stream.close(); } }
这样无疑有些繁琐,并且finally块尚有大概抛出异常。在JDK7种提出了try-with-resources机制, 它划定你操纵的类只要是实现了AutoCloseable接口就可以在try语句块退出的时候自动挪用close 要领封锁流资源。
public static void tryWithResources() throws IOException { try( InputStream ins = new FileInputStream("/home/biezhi/a.txt") ){ char charStr = (char) ins.read(); System.out.print(charStr); } }
利用多个资源
try ( InputStream is = new FileInputStream("/home/biezhi/a.txt"); OutputStream os = new FileOutputStream("/home/biezhi/b.txt") ) { char charStr = (char) is.read(); os.write(charStr); }
虽然假如你利用的长短尺度库的类也可以自界说AutoCloseable,只要实现其close要领即可。
捕捉多个Exception
当我们在操纵一个工具的时候,有时候它会抛出多个异常,像这样:
try { Thread.sleep(20000); FileInputStream fis = new FileInputStream("/a/b.txt"); } catch (InterruptedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
这样代码写起来要捕捉许多异常,不是很优雅,JDK7种答允你捕捉多个异常:
try { Thread.sleep(20000); FileInputStream fis = new FileInputStream("/a/b.txt"); } catch (InterruptedException | IOException e) { e.printStackTrace(); }
而且catch语句后头的异常参数是final的,不行以再修改/复制。
处理惩罚反射异常
利用过反射的同学大概知道我们有时候操纵反射要领的时候会抛出许多不相关的查抄异常,譬喻:
try { Class<?> clazz = Class.forName("com.biezhi.apple.User"); clazz.getMethods()[0].invoke(object); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }
尽量你可以利用catch多个异常的要领将上述异常都捕捉,但这也让人感想疾苦。 JDK7修复了这个缺陷,引入了一个新类ReflectiveOperationException可以帮你捕捉这些反射异常:
try { Class<?> clazz = Class.forName("com.biezhi.apple.User"); clazz.getMethods()[0].invoke(object); } catch (ReflectiveOperationException e){ e.printStackTrace(); }
文件操纵
我们知道在JDK6甚至之前的时候,我们想要读取一个文本文件也长短常贫苦的一件事,而此刻他们都变得简朴了, 这要归功于NIO2,我们先看看之前的做法:
读取一个文本文件
BufferedReader br = null; try { new BufferedReader(new FileReader("file.txt")); StringBuilder sb = new StringBuilder(); String line = br.readLine(); while (line != null) { sb.append(line); sb.append(System.lineSeparator()); line = br.readLine(); } String everything = sb.toString(); } catch (Exception e){ e.printStackTrace(); } finally { try { br.close(); } catch (IOException e) { e.printStackTrace(); } }
各人对这样的一段代码必然不生疏,但这样太繁琐了,我只想读取一个文本文件,要写这么多代码还要 处理惩罚让人头大的一堆异常,怪不得别人吐槽Java臃肿,是在下输了。。。
下面我要先容在JDK7中是如何改进这些问题的。
Path
Path用于来暗示文件路径和文件,和File工具雷同,Path工具并不必然要对应一个实际存在的文件, 它只是一个路径的抽象序列。
要建设一个Path工具有多种要领,首先是final类Paths的两个static要领,如何从一个路径字符串来结构Path工具:
Path patp = Paths.get("/home/biezhi", "a.txt"); Path patp = Paths.get("/home/biezhi/a.txt"); URI u = URI.create("file:////home/biezhi/a.txt"); Path pathURI = Paths.get(u);
通过FileSystems结构
Path filePath = FileSystems.getDefault().getPath("/home/biezhi", "a.txt");
Path、URI、File之间的转换
File file = new File("/home/biezhi/a.txt"); Path p1 = file.toPath(); p1.toFile(); file.toURI();
读写文件