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文档和在线中很容易被发现,而在大多数情况下并不是一般的好事。 由于该问题没有提供关于原因的背景,因此很难提供任何更合理的方法。