文档章节

Java7的文件路径篇

文文1
 文文1
发布于 02/15 23:43
字数 1195
阅读 11
收藏 0

 Java7中对文件管理提供了大量的新API,这些新的接口可以使我们操纵文件以及文件夹更加方便。它们大多位于java.nio.file包下。 
 

  • java.nio.file.Paths 包含了用于创建Path对象的静态方法
  • java.nio.file.Path 包含了大量用于操纵文件路径的方法
  • java.nio.file.FileSystems 用于访问文件系统的类
  • java.nio.file.FileSystem 代表了一种文件系统,例如Unix下的根目录为 / ,而Windows下则为C盘
  • java.nio.file.FileStore 代表了真正的存储设备,提供了设备的详尽信息
  • java.nio.file.attribute.FileStoreAttributeView 提供了访问文件的信息



  一个路径可以确定一个文件或者文件夹的具体位置。Java7中用Path对象来实现对文件或者文件夹的操作。获得一个Path对象的方法有很多,主要有以下两种: 
 

  • 使用FileSystem对象的getPath方法
  • 使用Path对象的get方法



  我们先来看看getPath方法,示例代码如下。 
 

Java代码 

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。 
 

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方法。 
 

Java代码 

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中新引用的这些类的确大大简化了我们进行文件操作,使得操作文件不再那么繁琐。

本文转载自:https://evil850209.iteye.com/blog/1923417

共有 人打赏支持
文文1
粉丝 23
博文 391
码字总数 124158
作品 0
长沙
程序员
私信 提问
在 Java 7 里如何对文件进行操作

本文是从 Manipulating Files in Java 7 这篇文章翻译而来,原文出处:外刊IT评论。 下面的代码片段是由经过验证的程序修改而来。观察这些代码片段你会发现,跟以前的版本相比,在Java7里,文...

红薯
2011/10/27
317
2
NIO.2特性总结(一)灵活的Path

NIO.2,More New I/O APIs for the Java Platform。 技术发展实在太快,NIO都没弄透,java7中的NIO2又要开始进入我们的程序,优化系统的性能了。最近在看《PRO Java 7 NIO.2》CSDN上有下载,...

Gaischen
2012/12/01
0
3
Linux安装更新JDK

linux系统中安装配置jdk具体步骤如下: 1、前期工作检查系统环境 # java -version --查看是否已经安装jdk # which java --查看jdk路径 # getconf LONG_BIT --查看系统版本 # rpm -qa grep g...

江南炫影
2016/12/21
10
0
swt/jface中FileDialog的使用

在SWT/JFace中,使用文件对话框选择文件。貌似awt和swing应该都提供文件选择对话框,不过之前都没用过。有了自带的文件对话框,就不用可以把更多的时间发在其他功能的实现上了。 下面说说具体...

Nori
2016/06/04
29
0
深入理解Java 7(笔记)

switch Java 7 中新增加了对String的支持,除此之外还支持int、char、byte、short及其封装类Integer、Character、Byte、Short。对于基本类型的支持我们很容易理解,但是String类型使用了不同...

chris_2009
2016/03/30
103
0

没有更多内容

加载失败,请刷新页面

加载更多

【C++】智能指针简述(四):shared_ptr

  在开始本文内容之前,我们再来总结一下,前文内容:   1.智能指针采用RAII机制,在构造对象时进行资源的初始化,析构对象时进行资源的清理及汕尾.   2.auto_ptr防止拷贝后析构释放同一块内...

shzwork
26分钟前
1
0
作为Java程序员这些技术都不会,拿什么去涨薪跳槽?

引言 当下,正面临着近几年来的最严重的互联网寒冬,听得最多的一句话便是:相见于江湖~,缩减HC、裁员不绝于耳,大家都是人心惶惶,年前如此,年后想必肯定又是一场更为惨烈的江湖厮杀。但博...

别打我会飞
49分钟前
2
0
springboot开发之定时器quartz 定时任务调度(压缩版,抽取quartz的单个任务表实现)

前言 老了, 记不住了, 好记性不如烂笔头; 没想到曾经过目不忘的我, 也有这么一天, 岁月蹉跎,学习一天不如一天 难受 Quartz可以用来做什么? Quartz是一个任务调度框架。比如你遇到这样的问题...

尾生
54分钟前
11
0
技术经理平时都干啥?

「技术主管」是开发团队中的某位程序员需要对一起创建系统的整个开发团队负责时所承担的角色。通常他既要对最终交付的软件系统负责,另外也会像一个程序员一样去开发实现系统。 一个技术主管...

春哥大魔王的博客
今天
7
0
java工作流引擎Jflow流程事件和流程节点事件设置

流程实例的引入和设置 关键词: 开源工作流引擎 Java工作流开发 .net开源工作流引擎 流程事件 工作流节点事件 应用场景: 在一些复杂的业务逻辑流程中需要在某个节点或者是流程结束后做一些业...

ccflow周朋
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部