Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java InputStream中的文件路径/名称_Java_Io_Inputstream - Fatal编程技术网

Java InputStream中的文件路径/名称

Java InputStream中的文件路径/名称,java,io,inputstream,Java,Io,Inputstream,如何在Java中从InputStream获取文件路径/名称?您不能,因为InputStream可能不是文件或路径。您可以实现自己的动态生成数据的InputStream,这是不可能的。(不是来自Java API中的文件InputStream)。FileInputStream构造函数不在任何字段中存储此信息: public FileInputStream(File file) throws FileNotFoundException { String name = (file != null

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

您不能,因为
InputStream
可能不是文件或路径。您可以实现自己的动态生成数据的
InputStream
这是不可能的。(不是来自Java API中的文件InputStream)。
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
    的特定实现相关
  • 封装是向类的使用者/用户隐藏类的实现细节的过程。在这种特殊情况下,
    FileInputStream
    封装了它正在读取的文件的详细信息,因为作为
    InputStream
    ,该信息与使用无关。
    path
    实例字段被封装,因此类的用户无法使用

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

这不再完全正确。该路径现在已存储,但仍然不可访问。