来自 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 的文件路径/名称的主要内容,如果未能解决你的问题,请参考以下文章

将文件从外部存储加载到 Inputstream

java项目中,下载时怎样根据自定义的文件名去下载对象的文件(自定义的文件名和文件本身的名字不一样)

来自 URL 的 InputStream

从来自 java 中 InputStream 的字符串创建 Spark RDD 或数据帧

C#比较基于名称未返回完整路径的文件列表

如何通过表单上传文件并让 Java 将其作为 InputStream 处理? [复制]