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

我有一个要在Java程序中读取的驱动器中的文件。

在尝试使用以下方法读取文件之前:

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

但是由于文件不存在而失败,并出现错误。文件在那里,路径很好。

然后,我尝试了以下有效的代码:
String path = Paths.get(basePath, fileName).toAbsolutePath().toString()
File file = new File(path)

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

更新

因此,在我使用了第二部分(有效的部分)之后,我回到了原来的状态(按原样)来验证调试,这一次它起作用了。我在同一目录中尝试了另一个文件,但失败了。看起来很奇怪,但我会检查更多。

最佳答案

为了最好地了解可能发生的情况,我建议通过代码进行调试。下面,基于对源代码的理解,我将解释可能是什么问题。

首先,存在Path的不同实现,并且正如您所提到的,您正在Windows上工作,因此我查看了hereWindowsPath的源代码。

因此,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,例如绝对是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]

10-08 10:54