【问题标题】:How can I retrieve the original File of a FileInputStream如何检索 FileInputStream 的原始文件
【发布时间】:2012-02-18 11:19:14
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您为什么要这样做?这就像从子类调用超类,这是不好的做法。也许你没有正确模块化你的问题?
  • 如果您期望 FileInputStream,为什么不将形参类型更改为FileInputStream。如果您需要File,请将其更改为文件并自己构建流。

标签: java file virtual fileinputstream


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    据我所知,没有办法从FileInputStream 获取文件名。

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

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

    【讨论】:

    • 关于重新设计我不能,因为我说过我有 2 个 API 要连接,我需要一个转换器来这样做。我希望有某种方法可以绕过在系统进程上写入文件。似乎无法避免。顺便说一句,套接字如何生成 FileInputStream?更重要的是,“构造一个可读的 File 对象是否需要它存在于磁盘上的某个位置?我觉得这很奇怪……”
    猜你喜欢
    • 1970-01-01
    • 2018-07-22
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 2017-09-05
    相关资源
    最近更新 更多