Java 如何检索FileInputStream的原始文件

Java 如何检索FileInputStream的原始文件,java,file,virtual,fileinputstream,Java,File,Virtual,Fileinputstream,我需要基于我使用的API,使用InputStream参数(FileInputStream的实例)实现一个方法,该参数将调用带有文件参数的方法 implementedMethod(InputStream is){ FileInputStream fis = (FileInputStream)is; //always works File f = (???) ????(???).???; calledMethod(f); } 那么,当我只有一个FileInputStream

我需要基于我使用的API,使用
InputStream
参数(
FileInputStream
的实例)实现一个方法,该参数将调用带有
文件
参数的方法

implementedMethod(InputStream is){
    FileInputStream fis = (FileInputStream)is; //always works
    File f = (???) ????(???).???;
    calledMethod(f);
}
那么,当我只有一个
FileInputStream
时,如何提供该
文件呢?我不明白
FileChannel
FileDescriptor
(都在
FIS
中)到底是什么,以及它们是如何工作的

我猜这是不可能的,我必须在文件系统上写一个(temp)文件。如果没有,如果我可以用FileChannel或FileDescriptor在内存中创建我的文件,或者甚至用
RandomAccessFile
(?)之类的东西,我想知道如何


是否构造可读的
文件
对象需要它存在于磁盘上的某个位置?我觉得这很奇怪…

据我所知,无法从
文件输入流中获取文件名

据我们所知,流可以由表示套接字的文件描述符构造而成


我的建议是重新考虑您的设计。

您当然可以绕过API,并假设它不会一直工作(取决于JDK和SecurityManager),使用反射:

/**
 * Retrieves the {@link File} associated to given {@link FileInputStream}, if possible.
 * @param inputStream the input stream.
 * @return the file.
 */
@Nullable
public File retrieveFile(@NotNull final FileInputStream inputStream)
{
    @Nullable final File result;

    @Nullable String path = null;

    try
    {
        @Nullable final Field field =
            inputStream.getClass().getDeclaredField("path");
        field.setAccessible(true);
        path = (String) field.get(inputStream);
    }
    catch (@NotNull final Throwable noFieldOrNoRights)
    {
    }

    if (path == null)
    {
        result = null;
    }
    else
    {
        result = new File(path);
    }

    return result;
}

你为什么要这么做?这就像从子类调用超类,这是一种糟糕的做法。也许您没有正确地模块化问题?如果您希望使用FileInputStream,为什么不将形式参数类型更改为
FileInputStream
。如果您需要一个
文件
将其更改为File并自己构造流。关于重新设计,我不能,正如我所说,我有两个API要连接,我需要一个转换器来连接。我希望通过某种方式绕过在系统进程中编写文件的过程。看来这是不可避免的。顺便问一下,套接字如何生成FileInputStream?更重要的是,“构建一个可读文件对象是否需要它存在于磁盘上的某个地方?我觉得这很奇怪…”