Path.toFile()和新文件(pathString)的不同行为

时间:2018-04-27 13:08:09

标签: java file java-io network-drive java.nio.file

我在Windows中安装了网络驱动器(samba服务器)。

我想在Java程序中读取该驱动器中的文件。

在我尝试使用以下文件阅读文件之前:

Paths.get(basePath, fileName).toFile()

但是,如果文件不存在则错误。文件在那里,路径很好。

然后我尝试了下面的代码:

String path = Paths.get(basePath, fileName).toAbsolutePath().toString()
File file = new File(path)

两种方法之间有什么区别吗?它需要任何安全设置吗?

更新

所以在我使用了第二部分(有效的部分)之后,我又回到了原始版本(就像它一样)来验证调试,这次它有效。我尝试使用同一目录中的另一个文件,但它失败了。这看起来很奇怪,但我会检查更多。

2 个答案:

答案 0 :(得分:2)

为了最好地了解可能发生的事情,我建议您通过代码进行调试。下面我将根据我对源代码的理解解释可能存在的问题。

首先,Path有不同的实现,正如您所说,您正在使用Windows,因此我查看了WindowsPath的源代码,我找到了here

所以方法Path.toFile()非常简单。它是:

public final File toFile() {
    return new File(this.toString());
}

this指的是Path实现的实例,而在Windows的情况下,它是WindowsPath的实现。

查看WindowsPath课程,我们看到toString()的实施方式如下:

@Override
public String toString() {
    return path;
}

现在看看如何构建这个path变量。 WindowsPath类调用构建路径的WindowsPathParser类。可以找到WindowsPathParser的来源here

parse中的WindowsPathParser方法是您需要调试的地方,以确切了解发生的情况。根据您作为方法参数传递的初始path,此方法会将其作为不同的WindowsPathType进行解析,例如ABSOLUTE,DIRECTORY_RELATIVE。

以下代码显示了初始path输入如何更改WindowsPathType的类型

<强> 代码

private static final String OUTPUT = "Path to [%s] is [%s]";

public static void main(String args[]) throws NoSuchFieldException, IllegalAccessException {
    printPathInformation("c:\\dev\\code");
    printPathInformation("\\c\\dev\\code");
}

private static void printPathInformation(String path) throws NoSuchFieldException, IllegalAccessException {
    Path windowsPath = Paths.get(path);

    Object type = getWindowsPathType(windowsPath);

    System.out.println(String.format(OUTPUT,path, type));
}

private static Object getWindowsPathType(Path path) throws NoSuchFieldException, IllegalAccessException {
    Field type = path.getClass().getDeclaredField("type");

    type.setAccessible(true);

    return type.get(path);
}

<强> 输出

Path to [c:\dev\code] is [ABSOLUTE]
Path to [\c\dev\code] is [DIRECTORY_RELATIVE]

答案 1 :(得分:1)

我会检查你的文件路径和导入,因为这对我来说工作正常也不确定为什么你打破了你的路径,但也许是在谈论2种不同的路径导入

System.out.println("File:"+new File(path).exists());
System.out.println("Path:"+Paths.get(path).toFile().exists());

如果你想比较我的导入

import java.io.File;
import java.nio.file.Paths;

我想说一下,如果有任何改变的话,完整的路径根本没有被打破