如何检索FileInputStream的原始文件

时间:2012-01-25 08:51:57

标签: java file virtual fileinputstream

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

implementedMethod(InputStream is){
    FileInputStream fis = (FileInputStream)is; //always works
    File f = (???) ????(???).???;
    calledMethod(f);
}

那么当我拥有File时,如何提供FileInputStream?我不明白FileChannelFileDescriptor(两者都在FIS中)是什么以及它们是如何工作的。

我猜这不可能,我必须在文件系统上实际写一个(临时)文件。如果没有,如果我可以使用FileChannel或FileDescriptor在内存中创建我的文件,或者甚至用RandomAccessFile(?)创建我的文件,我想知道如何......

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

2 个答案:

答案 0 :(得分:2)

据我所知,无法从FileInputStream获取文件名。

据我们所知,流可以从一个文件描述符构造,例如代表一个套接字。

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

答案 1 :(得分:0)

您当然可以绕过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;
}