2

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

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

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

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

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

4

2 回答 2

2

据我所知,没有办法从FileInputStream.

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

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

于 2012-01-25T08:56:30.463 回答
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;
}
于 2014-03-03T08:37:27.990 回答