来自InputStream的文件路径/名称

问题描述:

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

这是不可能的。(不是来自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); 
    } 

您不能这样做,因为InputStream可能不是文件或路径。您可以实现自己的InputStream,可以即时生成数据

两个重要的面向对象设计原则,防止你在做什么你问:抽象和封装。

  • 抽象是定义具有仅需要其在特定上下文中使用(详情here)的详细情况的一般概念的过程。在这种情况下,抽象是InputStream,这是一个通用接口,可以提供字节,而不管这些字节的来源是InputStream的抽象没有文件路径的概念;这只与InputStream的特定实现有关。
  • 封装是从该类的消费者/用户隐藏类的实现细节的过程。在这种特殊情况下,FileInputStream封装了正在读取的文件的详细信息,因为该信息与该用法无关,因此为InputStreampath实例字段为,封装为,因此对类的用户不可用。

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