【Java原理系列】 java.nio.file.Paths原理方法源码分析

java.nio.file.Paths原理方法源码

原理

java.nio.file.Paths 类是Java NIO中用于操作文件路径的工具类。它提供了静态方法来创建和操作 java.nio.file.Path 对象。

在Java NIO中,Path 是一个接口,代表了文件系统中的路径。Paths 类提供了一些静态方法来创建 Path 对象。这些方法可以根据给定的字符串或URI来创建路径对象,并且可以将多个部分连接起来形成完整的路径。

Paths 类的原理如下:

  1. 创建路径:Paths 类提供了多个静态方法来创建 Path 对象。例如,可以使用 Paths.get(String) 方法通过给定的字符串创建一个路径对象。还可以使用 Paths.get(URI) 方法通过给定的URI创建一个路径对象。
  2. 操作路径:Path 对象提供了许多方法来操作路径。可以使用 Path.resolve(String) 方法将给定的字符串连接到当前路径上,从而生成一个新的路径。还可以使用 Path.getParent() 方法获取当前路径的父路径,使用 Path.getFileName() 方法获取当前路径的文件名等等。
  3. 文件系统操作:Path 对象还提供了一些方法来进行文件系统操作,例如检查文件是否存在、获取文件属性、创建目录等等。

总之,java.nio.file.Paths 类是一个用于创建和操作文件路径的实用工具类,它基于 java.nio.file.Path 接口提供了一系列静态方法,方便我们在Java程序中进行文件路径相关的操作。

方法用法

这是一个名为 Paths 的 Java 类,提供了用于处理路径的静态方法。

下面对其中的两个方法进行解释:

get(String first, String... more)

此方法将路径字符串(或多个字符串序列)转换为 Path 对象。如果 more 参数没有指定任何元素,则使用 first 参数作为要转换的路径字符串。如果 more 参数指定了一个或多个元素,则将每个非空字符串视为一系列名称元素,并连接它们以形成路径字符串。字符串的连接方式是根据具体的文件系统提供者而定,通常会使用文件系统的分隔符作为分隔符。例如,如果文件系统的分隔符是 “/”,则调用 getPath("/foo","bar","gus") 会将路径字符串 “/foo/bar/gus” 转换为 Path 对象。如果 first 是空字符串且 more 不包含任何非空字符串,则返回表示空路径的 Path 对象。

get(URI uri)

方法将给定的 URI 转换为 Path 对象。该方法遍历已安装的文件系统提供者,以查找与给定 URI 的方案匹配的提供者。不区分大小写地比较 URI 方案。如果找到提供者,则调用其 getPath 方法来进行转换。

对于默认提供者(由 URI 方案 “file” 标识),给定的 URI 必须具有非空的路径组件,并且查询和片段组件未定义。关于是否允许存在权限组件取决于具体的平台。返回的 Path 与默认文件系统关联。

默认提供者提供了类似于 java.io.File 类的“往返”保证。对于给定的路径 p,可以保证以下语句成立:

Paths.get(p.toUri()).equals(p.toAbsolutePath())

前提是原始 Path、URI 和新 Path 都是在同一个 Java 虚拟机中创建的(可能是不同的调用)。其他提供者是否提供任何保证取决于具体的提供者。

这些方法提供了方便的方式来将字符串或 URI 转换为 Path 对象。但需要注意的是,使用这些方法会隐含地假设对默认的文件系统的引用,并限制了调用代码的实用性。如果您希望更灵活地进行操作,可以使用现有的 Path 实例作为锚点,例如:Path dir = ...; Path path = dir.resolve("file");

中文源码

public final class Paths {
    private Paths() { }

    /**
     * 将路径字符串或一系列字符串转换为 {@code Path} 对象。
     * 如果 {@code more} 不指定任何元素,则使用 {@code first} 参数的值作为路径字符串进行转换。
     * 如果 {@code more} 指定一个或多个元素,则将每个非空字符串(包括 {@code first})视为名称元素序列(参见 {@link Path}),并连接起来形成路径字符串。
     * 字符串的连接方式是特定于提供程序的,但通常使用 {@link FileSystem#getSeparator name-separator} 作为分隔符进行连接。
     * 例如,如果名称分隔符为 "{@code /}",则调用 {@code getPath("/foo","bar","gus")} 将把路径字符串 "{@code /foo/bar/gus}" 转换为 {@code Path} 对象。
     * 如果 {@code first} 是空字符串且 {@code more} 不包含任何非空字符串,则返回表示空路径的 {@code Path} 对象。
     *
     * <p>通过调用 {@link FileSystems#getDefault default} {@link FileSystem} 的 {@link FileSystem#getPath getPath} 方法获取 {@code Path} 对象。
     *
     * <p>注意,虽然该方法非常方便,但使用它将意味着默认 {@code FileSystem} 的引用,并限制了调用代码的实用性。因此,不应在旨在灵活重用的库代码中使用它。
     * 更灵活的替代方案是使用现有的 {@code Path} 实例作为锚点,例如:
     * <pre>
     *     Path dir = ...
     *     Path path = dir.resolve("file");
     * </pre>
     *
     * @param   first
     *          路径字符串或路径字符串的初始部分
     * @param   more
     *          要连接形成路径字符串的附加字符串
     *
     * @return  结果 {@code Path} 对象
     *
     * @throws  InvalidPathException
     *          如果无法将路径字符串转换为 {@code Path} 对象
     *
     * @see FileSystem#getPath
     */
    public static Path get(String first, String... more) {
        return FileSystems.getDefault().getPath(first, more);
    }

    /**
     * 将给定的 URI 转换为 {@link Path} 对象。
     *
     * <p>该方法遍历已安装的 {@link FileSystemProvider#installedProviders() installed} 提供程序,
     * 以定位由给定 URI 的 URI {@link URI#getScheme scheme} 标识的提供程序。URI 方案不区分大小写进行比较。
     * 如果找到提供程序,则调用其 {@link FileSystemProvider#getPath getPath} 方法来转换 URI。
     *
     * <p>对于默认提供程序(由 URI 方案 "file" 标识),给定的 URI 具有非空路径组件和未定义的查询和片段组件。
     * 是否可以存在权限组件取决于平台。返回的 {@code Path} 与 {@link FileSystems#getDefault default} 文件系统相关联。
     *
     * <p>默认提供程序提供类似于 {@link java.io.File} 类的<em>往返</em>保证。对于给定的 {@code Path} <i>p</i>,
     * 可以保证以下条件成立:
     * <blockquote><tt>
     * Paths.get(</tt><i>p</i><tt>.{@link Path#toUri() toUri}()).equals(</tt>
     * <i>p</i><tt>.{@link Path#toAbsolutePath() toAbsolutePath}())</tt>
     * </blockquote>
     * 只要原始的 {@code Path}、{@code URI} 和新的 {@code Path} 都是在同一个 Java 虚拟机中创建的(可能是不同的调用)。
     * 其他提供程序是否提供任何保证是特定于提供程序的,因此未指定。
     *
     * @param   uri
     *          要转换的 URI
     *
     * @return  结果 {@code Path} 对象
     *
     * @throws  IllegalArgumentException
     *          如果 {@code uri} 参数上的前提条件不成立。URI 的格式是特定于提供程序的。
     * @throws  FileSystemNotFoundException
     *          标识的文件系统(由 URI 标识)不存在且无法自动创建,或者由 URI 的方案组件标识的提供程序未安装
     * @throws  SecurityException
     *          如果已安装安全管理器,并且它拒绝访问文件系统的未指定权限
     */
    public static Path get(URI uri) {
        String scheme =  uri.getScheme();
        if (scheme == null)
            throw new IllegalArgumentException("Missing scheme");

        // 检查默认提供程序,以避免加载已安装的提供程序
        if (scheme.equalsIgnoreCase("file"))
            return FileSystems.getDefault().provider().getPath(uri);

        // 尝试找到提供程序
        for (FileSystemProvider provider: FileSystemProvider.installedProviders()) {
            if (provider.getScheme().equalsIgnoreCase(scheme)) {
                return provider.getPath(uri);
            }
        }

        throw new FileSystemNotFoundException("Provider \"" + scheme + "\" not installed");
    }
}
  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以使用Java中的`java.nio.file.Paths`类来获取文件路径的`Path`对象。具体用法如下: ``` import java.nio.file.Path; import java.nio.file.Paths; Path path = Paths.get("file.txt"); ``` 其中"file.txt"可以替换成你想要获取路径的文件名称。 另外,如果你想要读取文件内容,可以使用Java中的`java.nio.file.Files`类来读取文件内容。 ``` import java.nio.file.Paths; import java.nio.file.Files; Path path = Paths.get("file.txt"); byte[] data = Files.readAllBytes(path); String content = new String(data); ``` 其中 "file.txt"可以替换成你想要读取的文件名称。 ### 回答2: Java中,可以使用File类来获取文件或目录的路径信息,而java.nio.file.Paths类则提供了一种更方便、更灵活的方式来管理路径。 通过File类获取路径信息的方式相对简单,只需要创建一个File对象,然后调用其getPath()方法即可返回该文件或目录的路径。例如: File file = new File("C:/test.txt"); String path = file.getPath(); 而使用java.nio.file.Paths类获取路径信息更加灵活。可以使用Paths类提供的静态方法get()来创建一个Path对象,然后通过该对象来获取路径信息。例如: Path path = Paths.get("C:/test.txt"); String filePath = path.toString(); String fileName = path.getFileName().toString(); String directory = path.getParent().toString(); 通过上述代码,可以分别获取到文件的完整路径、文件名以及文件所在目录的路径。 使用java.nio.file.Paths类获取路径信息的优势在于,可以更加方便地操作路径。Paths类提供了一系列方法,可以对路径进行拼接、替换、解析等操作,使得路径处理更加灵活和简便。 总而言之,通过File类可以直接获取到文件或目录的路径信息,而使用java.nio.file.Paths类则能够提供更加灵活、方便的路径管理方式,使得路径操作更加强大。 ### 回答3: JavaFile获取到java.nio.file.Paths的过程相对简单。首先,我们需要创建一个File对象,该对象代表要操作的文件或目录。 可以使用以下方式创建File对象: ```java File file = new File("路径/文件名"); ``` 其中,路径可以是绝对路径或相对路径。如果是相对路径,则相对于当前工作目录。 接下来,我们可以使用File对象的toPath()方法将其转换为Path对象。toPath()方法是通过java.nio.file.Paths类来实现的。 使用toPath()方法的示例如下: ```java Path path = file.toPath(); ``` 现在,我们已经成功地将File对象转换为Path对象。Path对象可以用于访问和操作文件系统中的文件和目录。它提供了许多有用的方法,如获取文件的名称、父目录、根目录等。 值得注意的是,使用java.nio.file.Paths类的toFile()方法,我们还可以将Path对象转换回File对象,如下所示: ```java File file = path.toFile(); ``` 综上所述,通过创建File对象并使用其toPath()方法,我们可以轻松地获取到java.nio.file.Paths对象,以便进一步操作和管理文件和目录。这方便了Java程序员使用更强大、更灵活的NIO.2 API进行文件操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigDataMLApplication

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值