Как преобразовать FileInputStream в InputStream? [закрыто]

116

Я просто хочу преобразовать a FileInputStreamв InputStream, как я могу это сделать?

например

FileInputStream fis = new FileInputStream("c://filename");
InputStream is = ?; 
fis.close();
Ranjan
источник
3
Ranjan. Не могли бы вы изменить правильный ответ на этот пост. Текущий ответ некачественный. Если вы измените его на тот, который ниже, это будет оптимальным.
Whitecat
Это был просто глупый вопрос ... У меня не было правильного представления о сериализации ... любой может сослаться на @sudocode
ранджан
4
это может быть глупый вопрос, но многие люди по-прежнему обращаются к нему, потому что он полезен.
Whitecat 03
1
@WilliMentzel Я пришел сюда в поисках фактического преобразования из Fileкласса в InputStream. Ваше редактирование предполагает, что автор просит именно об этом (по крайней мере, частично), и это неправильно.
Строка
@Line Я просто изменил форматирование, не думаю, что изменил значение. Если вы все еще возражаете, не стесняйтесь откатывать мои изменения. Затем это будет рассмотрено сообществом. Кстати: откуда вы знаете, что имел в виду автор, кроме того, какой сейчас вопрос?
Вилли Ментцель

Ответы:

7

Обычно вы сначала читаете из входного потока, а затем закрываете его. Вы можете обернуть FileInputStream в другой InputStream (или Reader). Он будет автоматически закрыт, когда вы закроете поток / ридер упаковки.

Если это метод, возвращающий InputStream вызывающей стороне, то ответственность за закрытие потока по завершении с ним лежит на вызывающей стороне. Если вы закроете его в своем методе, вызывающий не сможет его использовать.

Чтобы ответить на некоторые ваши комментарии ...

Чтобы отправить содержимое InputStream удаленному потребителю, вы должны записать содержимое InputStream в OutputStream, а затем закрыть оба потока.

Удаленный потребитель ничего не знает о созданных вами объектах потока. Он просто получает контент в InputStream, который он создаст, прочитает и закроет.

sudocode
источник
что, если я хочу отправить поток ввода по почте. .. можно ли закрыть с другой стороны .. или его не нужно закрывать
ранджан
2
Сам объект потока не сериализуем. Содержимое потока можно сериализовать - записав содержимое в OutputStream
Sudocode
На самом деле моя цель - отправить файл ... Я не хочу, чтобы что-либо запускалось после отправки ... например, как будто я отправляю строку ... чтобы другой стороне не нужно было беспокоиться о закрытии чего-либо.
Ranjan
1
Файл также не сериализуем. Но содержимое файла можно сериализовать с помощью OutputStream.
Sudocode
возможно ли, что я подожду какое-то определенное время, а затем
закрою поток ввода
136
InputStream is;

try {
    is = new FileInputStream("c://filename");

    is.close(); 
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

return is;
Кумар Вивек Митра
источник
12
Почему вызывается is.close () до того, как в конце возвращается is.
Talespin_Kit 09
57
InputStream is = new FileInputStream("c://filename");
return is;
Сумит Сингх
источник
2
Вот и ответ!
андрейкашин
36

FileInputStream - это inputStream.

FileInputStream fis = new FileInputStream("c://filename");
InputStream is = fis;
fis.close();  
return is;

Конечно, это не будет делать то, что вы хотите ; поток, который вы возвращаете, уже закрыт. Просто верните FileInputStream и покончите с этим. Вызывающий код должен закрыть его.

Джоэри Хендрикс
источник
или просто вернуться, fisхотя я не уверен в возвращении закрытого потока.
Bala R
6
Это глупо - если закрыть fis- то и закрытьis
RonK
1
если я
закрою
2
@RonK действительно. Вот почему я упоминаю об этом.
Joeri Hendrickx
3
Просто более краткий код return FileInputStream("c://filename");метода с типом возвращаемого значенияInputStream
Ятендра Гоэль
2

Если вы переносите один поток в другой, вы не закрываете промежуточные потоки, и это очень важно: вы не закрываете их до завершения использования внешних потоков. Потому что вы бы тоже закрыли внешний поток.

Пользователь неизвестен
источник