9

注意:请运行下面的确切代码;没有对其进行修改,特别是不要使用File,因为此错误与新java.nio.fileAPI相关联

好吧,这不是真正的“需要回答的问题”,而是呼吁证人......

设想:

  • 在你的操作系统上有一个目录,不管它是什么,你知道你有访问权限——用 Unix 的说法,你至少有它的读取权限(这意味着你可以列出其中的条目);在下面的代码中,假设 代表的路径System.getProperty("java.io.tmpdir")符合要求;
  • 安装了Oracle JDK 或 OpenJDK,7+;以便您可以java.nio.file随意使用。

现在,下面的代码所做的非常简单:它尝试使用InputStreamFiles.newInputStream(). 代码(也可在此处获得;添加了我的评论):

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public final class Main
{
    public static void main(final String... args)
        throws IOException
    {
        final Path path = Paths.get(System.getProperty("java.io.tmpdir"));
        try (
            final InputStream in = Files.newInputStream(path); // FAIL_OPEN
        ) {
            final byte[] buf = new byte[1024];
            int bytesRead;
            while ((bytesRead = in.read(buf)) != -1) // FAIL_READ
                System.out.printf("%d bytes read\n", bytesRead);
        }
    }
}

好的,现在当您运行该代码时,以下 JRE/OS 组合会发生这种情况:

  • Linux x86_64,Oracle JDK 1.8.0_25:IOException (is a directory)FAIL_READ
  • Linux x86_64,Oracle JDK 1.7.0_72:IOException (is a directory)FAIL_READ
  • Mac OS X x86_64,Oracle JDK 1.8.0_25:IOException (is a directory)FAIL_READ
  • Windows 7,Oracle JDK 1.8.0_25:AccessDeniedExceptionFAIL_OPEN(!!)。

老实说,我不知道如何处理那段代码。正如我在介绍中所说,我在这里寻找证人。我肯定会向 OpenJDK 开一个关于这个的 bug,看起来很严重。我还邮寄了关于这个问题的 nio-dev 邮件列表。

好吧,至于我想问的一个问题:IsDirectoryExceptionJDK 中的 a (继承FileSystemException)呢?我实际上已经在我的一个项目中定义了它来解决这样的问题。我不确定为什么“Java 人”没有考虑到这个问题......

4

1 回答 1

1

我的观察(抱歉,这里没有其他系统 atm,稍后我可能会添加 ARM):

  • JDK 1.8.0_25,Linux x86_64:java.io.IOException: Is a directory// FAIL_READ.

我同意这种行为是出乎意料的,首先应该不可能从目录创建 InputStream。我建议您将此作为错误提交。即使Files.newInputStream没有明确说明,该行为也与 API 的其余部分不一致。

于 2014-12-20T13:19:59.507 回答