Java7中对文件管理提供了大量的新API,这些新的接口可使咱们操纵文件以及文件夹更加方便。它们大多位于java.nio.file包下。
java
一个路径能够肯定一个文件或者文件夹的具体位置。Java7中用Path对象来实现对文件或者文件夹的操做。得到一个Path对象的方法有不少,主要有如下两种:
node
咱们先来看看getPath方法,示例代码以下。
code
Java代码 orm
public static void main(String[] args) { Path path = FileSystems.getDefault().getPath("/Home/projects/node.txt"); System.out.println(); System.out.println("toString: " + path.toString()); System.out.printf("getFileName: %s\n", path.getFileName()); System.out.printf("getRoot: %s\n", path.getRoot()); System.out.printf("getNameCount: %d\n", path.getNameCount()); for (int index = 0; index < path.getNameCount(); index++) { System.out.printf("getName(%d): %s\n", index, path.getName(index)); } System.out.printf("subpath(0,2): %s\n", path.subpath(0, 2)); System.out.printf("getParent: %s\n", path.getParent()); System.out.println(path.isAbsolute()); try { path = Paths.get("Home", "projects", "users.txt"); System.out.printf("Absolute path: %s", path.toAbsolutePath()); } catch (InvalidPathException ex) { System.out.printf("Bad path: [%s] at position %s", ex.getInput(), ex.getIndex()); } }
示例中FileSystems的getDefault方法,会由JVM返回一个表明了当前文件系统的FileSystem对象,咱们能够经过FileSystem来得到Path对象。一个Path能够由多个子Path组成,子Path能够可通用过subpath方法来得到。
使用Paths类的get方法一样能够得到一个Path对象,若是你查看JDK的源码你会发现,它的实现方式和用FileSystem是同样的。
对象
Java代码 接口
public static Path get(String first, String... more) { return FileSystems.getDefault().getPath(first, more); }
若是咱们使用的系统中有大量Java7以前对文件操做的代码,例如使用了不少File类的话,咱们能够经过Java7中对File类新增的toPath方法来将一个File转换成Path。
get
Java代码 源码
public static void main(String[] args) { try { Path path = Paths.get(new URI("file:///C:/home/docs/users.txt")); File file = new File("C:\\home\\docs\\users.txt"); Path toPath = file.toPath(); System.out.println(toPath.equals(path)); } catch (URISyntaxException e) { System.out.println("Bad URI"); } }
将一个相对路径转换成绝对路径,只须要调用Path类的toAbsolutePath方法。此外若是想要得到系统的路径分隔符,FileSystem也提供了getSeparator方法。
it
Java代码 io
public static void main(String[] args) { String separator = FileSystems.getDefault().getSeparator(); System.out.println("The separator is " + separator); try { Path path = Paths.get(new URI("file:///D:/Home/projects/node.txt")); System.out.println("subpath: " + path.subpath(0, 3)); path = Paths.get("/home", "docs", "users.txt"); System.out.println("Absolute path: " + path.toAbsolutePath()); System.out.println("URI: " + path.toUri()); } catch (URISyntaxException ex) { System.out.println("Bad URI"); } catch (InvalidPathException ex) { System.out.println("Bad path: [" + ex.getInput() + "] at position " + ex.getIndex()); } }
判断一个文件是否真实存在,在Files类中提供了exists方法,它接收一个Path对象做为参数。
Java代码
Path path = Paths.get(new URI("file:///C:/home/docs/bogusfile.txt")); System.out.println("File exists: " + Files.exists(path));
当路径描述符中有"."或者".."字符时,咱们能够经过调用Path的normalize方法将这些描述符转换成真正的路径。运行下面的代码,你会发现"."都被删除掉了,由于它表明当前路径。".."会用上一层路径代替。
Java代码
public static void main(String[] args) { Path path = Paths.get("D:/home/docs/../music/Space Machine A.mp3"); System.out.println("Absolute path: " + path.toAbsolutePath()); System.out.println("URI: " + path.toUri()); System.out.println("Normalized Path: " + path.normalize()); System.out.println("Normalized URI: " + path.normalize().toUri()); System.out.println(); path = Paths.get("D:/home/./music/ Robot Brain A.mp3"); System.out.println("Absolute path: " + path.toAbsolutePath()); System.out.println("URI: " + path.toUri()); System.out.println("Normalized Path: " + path.normalize()); System.out.println("Normalized URI: " + path.normalize().toUri()); }
Path的toRealPath会返回一个真实表明一个文件的路径,若是所指定的文件不存在,NoSuchFileException异常会被抛出。toRealPath能够传入一个LinkOption.NOFOLLOW_LINKS参数来将结果以连接的路径显示。Files判断文件是否存在的方法也能够加入此参数。下面的例子中music文件夹下的users是docs文件下users文件的连接。
Java代码
public static void main(String[] args) { Path path1 = null; Path path2 = null; path1 = Paths.get("/home/docs/users.txt"); path2 = Paths.get("/home/music/users.txt"); System.out.println(Files.isSymbolicLink(path1)); System.out.println(Files.isSymbolicLink(path2)); try { Path path = Paths.get("C:/home/./music/users.txt"); System.out.println("Normalized: " + path.normalize()); System.out.println("Absolute path: " + path.toAbsolutePath()); System.out.println("URI: " + path.toUri()); System.out.println("toRealPath (Do not follow links): " + path.toRealPath(LinkOption.NOFOLLOW_LINKS)); System.out.println("toRealPath: " + path.toRealPath()); Path firstPath = Paths.get("/home/music/users.txt"); Path secondPath = Paths.get("/docs/status.txt"); System.out.println("From firstPath to secondPath: " + firstPath.relativize(secondPath)); System.out.println("From secondPath to firstPath: " + secondPath.relativize(firstPath)); System.out.println("exists (Do not follow links): " + Files.exists(firstPath, LinkOption.NOFOLLOW_LINKS)); System.out.println("exists: " + Files.exists(firstPath)); System.out.println("notExists (Do not follow links): " + Files.notExists(firstPath, LinkOption.NOFOLLOW_LINKS)); System.out.println("notExists: " + Files.notExists(firstPath)); } catch (IOException ex) { Logger.getLogger(SymbolicLinkExample.class.getName()).log(Level.SEVERE, null, ex); } }
Java7中新引用的这些类的确大大简化了咱们进行文件操做,使得操做文件再也不那么繁琐。