¿Cómo convertir FileInputStream a InputStream? [cerrado]

116

Solo quiero convertir FileInputStreama en an InputStream, ¿cómo puedo hacer eso?

p.ej

FileInputStream fis = new FileInputStream("c://filename");
InputStream is = ?; 
fis.close();
ranjan
fuente
3
ranjan. ¿Puede cambiar la respuesta correcta a esta publicación? La respuesta actual es insatisfactoria. Si lo cambia por el siguiente, sería óptimo.
Whitecat
Fue solo una pregunta tonta ... No tenía una idea adecuada sobre la serialización ... cualquiera puede referirse a @sudocode
ranjan
4
Quizás sea una pregunta tonta, pero mucha gente todavía se refiere a esta pregunta porque es útil.
Whitecat
1
@WilliMentzel Vine aquí buscando una conversión real de Fileclase a InputStream. Su edición sugiere que eso es lo que el autor está pidiendo (al menos en parte), y no es correcto.
Línea
@Line Simplemente cambié el formato, no creo que haya cambiado el significado. Si aún tiene objeciones, puede deshacer mis cambios. Esto será revisado por la comunidad entonces. Por cierto: ¿cómo sabe lo que quiso decir el autor, excepto cuál es la pregunta ahora?
Willi Mentzel

Respuestas:

7

Por lo general, primero leería el flujo de entrada y luego lo cerraría. Puede envolver FileInputStream en otro InputStream (o lector). Se cerrará automáticamente cuando cierre el lector / flujo de envoltura.

Si este es un método que devuelve un InputStream a la persona que llama, entonces es responsabilidad de la persona que llama cerrar la transmisión cuando termine con ella. Si lo cierra en su método, la persona que llama no podrá usarlo.

Para responder a algunos de sus comentarios ...

Para enviar el contenido de InputStream a un consumidor remoto, debe escribir el contenido de InputStream en un OutputStream y luego cerrar ambos flujos.

El consumidor remoto no sabe nada sobre los objetos de flujo que ha creado. Simplemente recibe el contenido en un InputStream que creará, leerá y cerrará.

sudocode
fuente
¿Qué pasa si quiero enviar un flujo de entrada por correo? .. ¿Es posible cerrar en el otro lado .. o no es necesario cerrar?
ranjan
2
El objeto de flujo en sí no es serializable. El contenido de la transmisión se puede serializar, escribiendo contenido en un OutputStream
sudocode
En realidad, mi objetivo es enviar un archivo ... No quiero que nada se ejecute una vez que lo envíe ... por ejemplo, como si estuviera enviando una cadena ... para que el otro lado no tenga que preocuparse por cerrar nada.
ranjan
1
El archivo tampoco es serializable. Pero el contenido de un archivo se puede serializar usando un OutputStream.
sudocode
¿Es posible esperaré una cantidad específica de tiempo y luego cerraré el flujo de entrada, por ejemplo, dependiendo del tamaño del archivo
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;
Kumar Vivek Mitra
fuente
12
¿Por qué se llama "is.close ()" antes de que se devuelva "is" al final?
Talespin_Kit
57
InputStream is = new FileInputStream("c://filename");
return is;
Sumit Singh
fuente
2
¡Esa es la respuesta!
andreikashin
36

FileInputStream es un inputStream.

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

Por supuesto, esto no hará lo que usted quiere que haga ; la corriente que regresa ya se ha cerrado. Simplemente devuelva FileInputStream y termine con él. El código de llamada debería cerrarlo.

Joeri Hendrickx
fuente
o simplemente regresar fisaunque no estoy seguro de devolver una secuencia cerrada.
Bala R
6
Esto es estúpido - si cierras fis- también cierrasis
RonK
1
si cierro los datos del archivo no se envían
ranjan
2
@RonK de hecho. Por eso lo menciono.
Joeri Hendrickx
3
Solo un código más breve return FileInputStream("c://filename");en el método cuyo tipo de retorno esInputStream
Yatendra Goel
2

Si envuelve una secuencia en otra, no cierra las secuencias intermedias, y muy importante: no las cierra antes de terminar de usar las secuencias externas. Porque también cerrarías el arroyo exterior.

usuario desconocido
fuente