乐趣区

小师妹学JavaIO之文件File和路径Path

简介

文件和路径有什么关系?文件和路径又隐藏了什么秘密?在文件系统的管理下,创建路径的方式又有哪些?今天 F 师兄带小师妹再给大家来一场精彩的表演。

文件和路径

小师妹:F 师兄我有一个问题,java 中的文件 File 是一个类可以理解,因为文件里面包含了很多其他的信息,但是路径 Path 为什么也要单独一个类出来?只用一个 String 表示不是更简单?

更多精彩内容且看:

  • 区块链从入门到放弃系列教程 - 涵盖密码学, 超级账本, 以太坊,Libra, 比特币等持续更新
  • Spring Boot 2.X 系列教程: 七天从无到有掌握 Spring Boot- 持续更新
  • Spring 5.X 系列教程: 满足你对 Spring5 的一切想象 - 持续更新
  • java 程序员从小工到专家成神之路(2020 版)- 持续更新中, 附详细文章教程

更多内容请访问 www.flydean.com

万物皆有因,没有无缘无故的爱,也没有无缘无故的恨。一切真的是妙不可言啊。

我们来看下 File 和 path 的定义:

public class File
   implements Serializable, Comparable<File>
public interface Path
    extends Comparable<Path>, Iterable<Path>, Watchable

首先,File 是一个类,它表示的是所有的文件系统都拥有的属性和功能,不管你是 windows 还是 linux,他们中的 File 对象都应该是一样的。

File 中包含了 Path,小师妹你且看,Path 是一个 interface, 为什么是一个 interface 呢?因为 Path 根据不同的情况可以分为 JrtPath,UnixPath 和 ZipPath。三个 Path 所对应的 FileSystem 我们在上一篇文章中已经讨论过了。所以 Path 的实现是不同的,但是包含 Path 的 File 是相同的。

小师妹:F 师兄,这个怎么这么拗口,给我来一个直白通俗的解释吧。

既然这样,且听我解释:爱国版的,或许我们属于不同的民族,但是我们都是中国人。通俗版的,大家都是文化人儿,为啥就你这么拽。文化版的,同九年,汝何秀?

再看两者的实现接口,File 实现了 Serializable 表示可以被序列化,实现了 Comparable,表示可以被排序。

Path 继承 Comparable,表示可以被排序。继承 Iterable 表示可以被遍历,可以被遍历是因为 Path 可以表示目录。继承 Watchable,表示可以被注册到 WatchService 中,进行监控。

文件中的不同路径

小师妹:F 师兄,File 中有好几个关于 Path 的 get 方法,能讲一下他们的不同之处吗?

直接上代码:

public void getFilePath() throws IOException {File file= new File("../../www.flydean.com.txt");
        log.info("name is : {}",file.getName());

        log.info("path is : {}",file.getPath());
        log.info("absolutePath is : {}",file.getAbsolutePath());
        log.info("canonicalPath is : {}",file.getCanonicalPath());
    }

File 中有三个跟 Path 有关的方法,分别是 getPath,getAbsolutePath 和 getCanonicalPath。

getPath 返回的结果就是 new File 的时候传入的路径,输入什么返回什么。

getAbsolutePath 返回的是绝对路径,就是在 getPath 前面加上了当前的路径。

getCanonicalPath 返回的是精简后的 AbsolutePath,就是去掉了. 或者.. 之类的指代符号。

看下输出结果:

 INFO com.flydean.FilePathUsage - name is : www.flydean.com.txt
 INFO com.flydean.FilePathUsage - path is : ../../www.flydean.com.txt
 INFO com.flydean.FilePathUsage - absolutePath is : /Users/flydean/learn-java-io-nio/file-path/../../www.flydean.com.txt
 INFO com.flydean.FilePathUsage - canonicalPath is : /Users/flydean/www.flydean.com.txt

构建不同的 Path

小师妹:F 师兄,我记得路径有相对路径,绝对路径等,是不是也有相应的创建 Path 的方法呢?

当然有的,先看下绝对路径的创建:

public void getAbsolutePath(){Path absolutePath = Paths.get("/data/flydean/learn-java-io-nio/file-path", "src/resource","www.flydean.com.txt");
        log.info("absolutePath {}",absolutePath );
    }

我们可以使用 Paths.get 方法传入绝对路径的地址来构建绝对路径。

同样使用 Paths.get 方法,传入非绝对路径可以构建相对路径。

public void getRelativePath(){Path RelativePath = Paths.get("src", "resource","www.flydean.com.txt");
        log.info("absolutePath {}",RelativePath.toAbsolutePath());
    }

我们还可以从 URI 中构建 Path:

public void getPathfromURI(){URI uri = URI.create("file:///data/flydean/learn-java-io-nio/file-path/src/resource/www.flydean.com.txt");
        log.info("schema {}",uri.getScheme());
        log.info("default provider absolutePath {}",FileSystems.getDefault().provider().getPath(uri).toAbsolutePath().toString());
    }

也可以从 FileSystem 构建 Path:

public void getPathWithFileSystem(){Path path1 = FileSystems.getDefault().getPath(System.getProperty("user.home"), "flydean", "flydean.txt");
           log.info(path1.toAbsolutePath().toString());

            Path path2 = FileSystems.getDefault().getPath("/Users", "flydean", "flydean.txt");
            log.info(path2.toAbsolutePath().toString());

        }

总结

好多好多 Path 的创建方法,总有一款适合你。快来挑选吧。

本文的例子 https://github.com/ddean2009/learn-java-io-nio

本文作者:flydean 程序那些事

本文链接:http://www.flydean.com/java-io-file-path/

本文来源:flydean 的博客

欢迎关注我的公众号: 程序那些事,更多精彩等着您!

退出移动版