Java 如何获取inputStream使用的文件名?

Java 如何获取inputStream使用的文件名?,java,Java,我有一个方法接受InputStream作为参数。如何找到传递的处理程序正在处理的文件 例如: public performSomething(InputStream inputStream) { System.out.println(FILENAME); } 文件名应替换为什么,以便显示处理程序打开的文件名。我想您不能,因为输入流可能不属于文件。例如,它可以是SocketInputStream,也可以是ByteArrayInputStream。输入流只是一个抽象可以创建一个输入流来读取

我有一个方法接受InputStream作为参数。如何找到传递的处理程序正在处理的文件

例如:

public performSomething(InputStream inputStream) {
    System.out.println(FILENAME);
}

文件名应替换为什么,以便显示处理程序打开的文件名。

我想您不能,因为输入流可能不属于文件。例如,它可以是
SocketInputStream
,也可以是
ByteArrayInputStream
。输入流只是一个抽象

可以创建一个输入流来读取文件或任何其他数据源。因此,将文件名附加到输入流是没有意义的

简单的例子:

InputStream input= assetInfo.openStream();
    File t = new File("");

    OutputStream out = new FileOutputStream(t);

    int read=0;
    byte[] bytes = new byte[1024];

    while((read = input.read(bytes))!= -1){
        out.write(bytes, 0, read);
    }

查看assetInfo以查看该类是否公开该数据(您甚至可以使用反射查看该类内部)。请注意,创建者或assetInfo在未公开此信息时犯了一个设计错误,或者您现在正试图这样做。

即使您确定自己有一个
文件输入流,您仍然无法获取基础文件
FileInputStream
不保留其
File
参数,但会立即打开文件并仅保留
FileDescriptor
,它是操作系统资源的本机
int
句柄的包装

从OpenJDK版本7更新40开始,引入了一个
String path
变量,因此如果运气好的话,您可以尝试反射式地获得它


当然,这只能是试探法。没有通过公共API的官方方式。

或者它可以是标准输入。例如,它是FileInputStream。那么有没有可能?@user657592您无法直接获取它的名称,但您可以获取它的文件描述符-也许您可以以某种方式使用它来查找名称。作为旁注-FileDescriptor只是一个
int
-即使流属于一个文件,
FileInputStream
也可能被包装,例如在
BufferedInputStream
中。另一方面,在Oracle的实现中,
SocketInputStream
FileInputStream
的一个子类,因此拥有
FileInputStream
并不意味着存在关联的文件。谢谢,我不知道我该怎么办?删除这个问题?我不明白这个答案,不需要删除它。随它去吧。用户将遍历并以重复的形式结束问题:)我需要这个用于日志记录。可以从不同的位置调用此方法。如果要记录文件名,则无法完成。是吗?不是。但这只是一个例子。@Java如果您是从-可能重复的问题答案中复制答案,您可以让用户直接在注释中查看。+1表示“请注意,创建者或assetInfo犯了一个设计错误,没有公开此信息,或者您现在正试图这样做。”因此,简而言之,没有防故障的方法可以获取文件名?不,不幸的是没有。