Как я могу получить исходный файл FileInputStream - PullRequest
2 голосов
/ 25 января 2012

Мне нужно на основе API, которые я использую, реализовать метод с параметром InputStream (экземпляр FileInputStream), который будет вызывать метод с аргументом File.

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

Так, как я могу предоставить это File, когда все, что у меня есть FileInputStream?Я не понимаю, что такое FileChannel или FileDescriptor (оба в FIS), и как они работают.

Я предполагаю, что это не может быть сделано, и что мне действительно нужно будет записать (временный) файл в файловую систему.Если нет, если я могу создать свой файл в памяти вместо этого с помощью FileChannel или FileDescriptor, или даже с чем-то вроде RandomAccessFile (?), Я бы хотел знать, как ...

Это конструирование читабельногоFile объект требует, чтобы он существовал где-то на диске?Я нахожу это странным ...

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Насколько я знаю, нет способа получить имя файла из FileInputStream.

Насколько нам известно, поток мог быть создан из файлового дескриптора, представляющего, например, сокет.

Я бы порекомендовал переосмыслить ваш дизайн.

0 голосов
/ 03 марта 2014

Конечно, вы можете обойти 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;
}
...