来自 InputStream 的文件路径/名称
Posted
技术标签:
【中文标题】来自 InputStream 的文件路径/名称【英文标题】:File path/name from InputStream 【发布时间】:2011-01-30 21:51:21 【问题描述】:如何从 Java 中的 InputStream 中获取文件路径/名称?
【问题讨论】:
【参考方案1】:两个重要的面向对象设计原则阻止你做你所要求的:抽象和封装。
抽象是定义一般概念的过程,该概念仅包含在特定上下文中使用所需的细节(更多细节here)。在这种情况下,抽象是InputStream
,这是一个可以提供字节的通用接口,无论这些字节的来源是什么。 InputStream
的抽象没有文件路径的概念;这仅与 InputStream
的特定实现有关。
封装是向该类的消费者/用户隐藏类的实现细节的过程。在这种特殊情况下,FileInputStream
封装了它正在读取的文件的详细信息,因为作为InputStream
,该信息与使用无关。 path
实例字段被封装,因此该类的用户无法使用。
话虽如此,如果您愿意接受一些重要的限制,是可以访问path
变量的。基本上,要点是您可以检查InputStream
是否实际上是FileInputStream
的实例,如果是,则使用反射来读取path
实例字段。我将省略进行该访问的详细信息,因为它很容易在java.lang.Class
Java 文档和在线中找到,并且在大多数情况下通常不是一件好事。由于该问题没有提供有关原因的上下文,因此很难提供任何更合理的方法。
【讨论】:
【参考方案2】:这是不可能的。(不是来自 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);
【讨论】:
这不再是真的了。路径现已存储,但仍无法访问。【参考方案3】:您不能,因为InputStream
可能不是文件或路径。您可以实现自己的 InputStream
动态生成数据
【讨论】:
以上是关于来自 InputStream 的文件路径/名称的主要内容,如果未能解决你的问题,请参考以下文章
java项目中,下载时怎样根据自定义的文件名去下载对象的文件(自定义的文件名和文件本身的名字不一样)