从InputStream获取文件路径/名称

16

如何从Java的InputStream中获取文件路径/名称?

3个回答

13

不可能实现。(不是来自Java API中的FileInputStream)。FileInputStream构造函数不会将此信息存储在任何字段中:

public FileInputStream(File file) throws FileNotFoundException {
    String name = (file != null ? file.getPath() : null);
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkRead(name);
    }
        if (name == null) {
            throw new NullPointerException();
        }
    fd = new FileDescriptor();
    open(name);
    }

1
这已经不完全正确了。路径现在已经被存储,但仍然无法访问。 - Martin Serrano

10

你不能这样做,因为InputStream可能不是文件或路径。你可以实现自己的InputStream来动态生成数据。


5

两个重要的面向对象设计原则阻止你做你所要求的事情:抽象和封装。

  • 抽象是定义一个只有在特定上下文中使用所需细节的通用概念的过程(更多细节在这里)。在这种情况下,抽象是InputStream,它是一个通用接口,可以提供字节,无论这些字节的来源如何InputStream的抽象没有文件路径的概念;这只与InputStream的特定实现相关。
  • 封装是将类的实现细节隐藏起来,不让类的使用者看到。在这种情况下,FileInputStream封装了它正在读取的文件的细节,因为作为一个InputStream,这些信息对于使用是不相关的。 path实例字段被封装,因此对于类的使用者不可用。

话虽如此,如果您愿意接受一些重要的限制,访问path变量是可能的。基本上,要点是您可以检查InputStream是否实际上是FileInputStream的实例,如果是,则使用反射读取path实例字段。我将省略访问的详细信息,因为它在java.lang.Class Java文档和在线上很容易发现,并且在大多数情况下并不是一个真正好的事情。由于问题没有提供关于为什么的上下文,因此很难提供任何更合理的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接