InputStream中的文件路径/名称

如何从Java中的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 ,即时生成数据

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

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

话虽如此,如果您愿意接受一些重要的限制, 可以访问path变量。 基本上,要点是您可以检查InputStream实际上是否是FileInputStream的实例,如果是,则使用reflection来读取path实例字段。 我将忽略执行该访问的细节,因为它在java.lang.Class Java文档和在线中很容易被发现,而在大多数情况下并不是一般的好事。 由于该问题没有提供关于原因的背景,因此很难提供任何更合理的方法。