1

我刚刚阅读了本教程,如果路径引用的文件确实存在,则 toRealPath() 应该返回绝对路径。

这是同一教程的片段:

try {
       Path fp = path.toRealPath(); } catch (NoSuchFileException x) {
       System.err.format("%s: no such" + " file or directory%n", path);
       // Logic for case when file doesn't exist. } catch (IOException x) {
       System.err.format("%s%n", x);
       // Logic for sort of file error. }

因此,现在当我使用位于桌面上的现有文件时,例如 ( Path inputPath = Paths.get("/home/user/Desktop/indeed.txt");它给了我一个例外,就像它不存在一样。什么可能导致这个问题?确实提前非常感谢。

编辑:我从中得到一个 NoSuchFileException 。

java.nio.file.NoSuchFileException: /home/user/Desktop/indeed.txt
    at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
    at sun.nio.fs.UnixPath.toRealPath(UnixPath.java:833)
    at Pathss.main(Pathss.java:25)
4

2 回答 2

2

根据jdk的源码,translateToIOException方法是这样实现的:

private IOException translateToIOException(String file, String other) {
    // created with message rather than errno
    if (msg != null)
        return new IOException(msg);

    // handle specific cases
    if (errno() == UnixConstants.EACCES)
        return new AccessDeniedException(file, other, null);
    if (errno() == UnixConstants.ENOENT)
        return new NoSuchFileException(file, other, null);
    if (errno() == UnixConstants.EEXIST)
        return new FileAlreadyExistsException(file, other, null);

    // fallback to the more general exception
    return new FileSystemException(file, other, errorString());
}

您可以在此处查看整个源代码http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/sun/nio/fs/UnixException.java#86

根据实现,当抛出 NoSuchFileException 时,会发生 ENOENT 错误。unix 上的 ENOENT 代表没有这样的文件或目录。

你确定文件“/home/user/Desktop/indeed.txt”存在吗?或者您有权访问它。

命令 ls -l /home/user/Desktop/indeed.txt 的结果是什么

你用的是什么版本的jdk?

于 2013-04-29T15:52:19.733 回答
1

你能告诉我们抛出的确切异常吗?正如你提到的教程所说:

如果文件不存在或无法访问,此方法将引发异常。

因此,您可能根本无法访问该文件。

于 2013-04-29T15:13:11.863 回答