当目标路径是目录时,Files.newInputStream()无关紧要的行为?

时间:2014-12-06 02:51:49

标签: java java.nio.file

注意:请运行以下确切代码;特别是不要使用File进行修改,因为此错误与新的java.nio.file API相关

好的,这不是一个需要回答的问题"而是要求证人......

情景:

  • 在您的操作系统上有一个目录,无论它是什么,您知道您有权访问 - 在Unix用语中,您至少具有读取权限(这意味着您可以列出其中的条目);在下面的代码中,假设System.getProperty("java.io.tmpdir")表示的路径符合帐单;
  • 安装 Oracle JDK或OpenJDK,7+ ;这样你就可以java.nio.file了。

现在,下面的代码非常简单:尝试open a new InputStream on this directory using Files.newInputStream()。代码(也可用here;添加评论我的):

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:AccessDeniedException FAIL_OPEN(!!)。

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

好吧,至于一个问题,我有一个:JDK中的IsDirectoryException怎么样(继承FileSystemException)?我实际上在one of my projects中定义了它来解决这个问题。我不确定为什么这个问题不被#34; Java家伙考虑......

1 个答案:

答案 0 :(得分:1)

我的观察(抱歉,此处没有其他系统,后来我可能会添加ARM):

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

我同意这种行为是意外的,不应该首先从目录创建一个InputStream。 我建议您将其归档为错误。即使Files.newInputStream没有明确说明,行为也与API的其余部分不一致。