Як конвертувати FileInputStream у InputStream? [зачинено]


116

Я просто хочу перетворити FileInputStreamна InputStream, як це зробити?

напр

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

3
ranjan. Чи можете ви змінити правильну відповідь на цю публікацію. Поточна відповідь - subpar. Якщо змінити його на той, що нижче, це було б оптимальним.
Whitecat

Це було просто дурне питання. Я не мав належного уявлення про серіалізацію ... хтось може звернутися до @sudocode
ranjan

4
це може бути нерозумне питання, але багато людей все ж посилаються на це питання, оскільки воно корисне.
Whitecat

1
@WilliMentzel Я прийшов сюди, шукаючи фактичну конверсію з Fileкласу в InputStream. Ваша редакція підказує, що це запитує автор (принаймні частково), і це не правильно.
Лінія

@Line Я просто змінив форматування, я не думаю, що я змінив значення. Якщо ви все-таки заперечуєте, сміливо відкатуйте мої зміни. Це буде розглянуто громадою потім. До речі: як ти знаєш, що мав на увазі автор, окрім того, про що йдеться зараз у питанні?
Віллі Менцель

Відповіді:


7

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

Якщо це метод, який повертає InputStream абоненту, тоді відповідальність за виклик повинен закрити потік, коли закінчиться з ним. Якщо ви закриєте його у своєму методі, абонент не зможе ним скористатися.

Щоб відповісти на деякі ваші коментарі ...

Щоб надіслати вміст InputStream віддаленому споживачеві, ви б написали вміст InputStream у OutputStream, а потім закрили обидва потоки.

Віддалений споживач нічого не знає про створені вами потокові об’єкти. Він просто отримує вміст у InputStream, який він буде створювати, читати та закривати.


Що робити, якщо я хочу відправити вхідний потік поштою. .. чи можна закрити з іншого боку .. чи не потрібно його закривати
ranjan

2
Сам об’єкт потоку не піддається серіалізації. Вміст потоку можна серіалізувати - написавши вміст у
OutputStream

Насправді моя мета - надіслати файл .. Я не хочу, щоб нічого, коли я надсилаю, нічого не було запущено.
ranjan

1
Файл також не можна серіалізувати. Але вміст файлу можна серіалізувати за допомогою OutputStream.
sudocode

чи можливо я зачекаю якийсь конкретний проміжок часу, а потім закрию вхідний потік, наприклад, залежно від розміру файлу
ranjan

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 ()", перш ніж "є" повернеться в кінці.
Talespin_Kit


36

FileInputStream - це inputStream.

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

Звичайно, це не буде робити те, що ви хочете, щоб це зробити ; потік, який ви повернете, вже закритий. Просто поверніть FileInputStream і виконайте його. Викликовий код повинен закрити його.


або просто повернутися, fisхоча я не впевнений у поверненні закритого потоку.
Бала R

6
Це дурне - якщо fisis
закриєш

1
якщо я
закрию

2
@RonK дійсно. Ось чому я це згадую.
Joeri Hendrickx

3
Ще return FileInputStream("c://filename");InputStream
коротший

2

Якщо ви загортаєте один потік в інший, ви не закриваєте проміжні потоки, і дуже важливо: ви не закриваєте їх перед тим, як закінчити використання зовнішніх потоків. Тому що ви також закрили б зовнішній потік.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.