2010-02-28 26 views
42

tengo esta línea en mi programa:Cómo convertir InputStream a FileInputStream

InputStream Resource_InputStream=this.getClass().getClassLoader().getResourceAsStream("Resource_Name"); 

Pero, ¿cómo puedo obtener de ella FileInputStream [Resource_InputStream]?

+9

¿Por qué es necesario que sea un FileInputStream? – nos

+2

¿Está seguro de que hay incluso un archivo real respaldando su recurso y no una entrada en un archivo JAR? –

Respuesta

53

Use ClassLoader#getResource() en su lugar si su URI representa una ruta del sistema de archivos de disco local válida.

URL resource = classLoader.getResource("resource.ext"); 
File file = new File(resource.toURI()); 
FileInputStream input = new FileInputStream(file); 
// ... 

Si no lo hace (por ejemplo, JAR), la mejor opción es copiarlo en un archivo temporal.

Path temp = Files.createTempFile("resource-", ".ext"); 
Files.copy(classLoader.getResourceAsStream("resource.ext"), temp, StandardCopyOption.REPLACE_EXISTING); 
FileInputStream input = new FileInputStream(temp.toFile()); 
// ... 

Dicho esto, yo realmente no veo ningún beneficio de hacerlo, o debe ser requerido por una mala clase de ayuda/método que requiere FileInputStream en lugar de InputStream. Si puede, simplemente corrija la API para solicitar un InputStream. Si es un tercero, de todos modos infórmelo como un error. En este caso específico también pondría signos de interrogación sobre el resto de esa API.

+0

en lugar de 'FileInputStream input = new FileInputStream (temp.toFile());', utilicé 'FileInputStream input = new FileInputStream (temp.toString());'. porque 'temp.toFile' dejaría posiblemente una entrada vacía (FileInputStream). por la posible razón puede marcar Path.toFile java api doc –

11

historia corta corta: No utilice FileInputStream como un parámetro o tipo de variable. Utilice la clase base abstracta, en este caso InputStream en su lugar.

+17

No me gusta esta respuesta, a veces realmente necesita un FileInputStream porque necesita métodos de su API como getChannel() por ejemplo, y no le preguntó si es una buena idea o no utilizar un InputStream, solo si es posible o no crear un flujo de entrada de archivo desde un flujo de entrada. Podría haber usado un comentario en lugar de agregar una nueva respuesta. – arielsan

+0

¿Qué pasa con java.util.Properties? – sloven

0

Usted necesita algo así como:

URL resource = this.getClass().getResource("/path/to/resource.res"); 
    File is = null; 
    try { 
     is = new File(resource.toURI()); 
    } catch (URISyntaxException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    try { 
     FileInputStream input = new FileInputStream(is); 
    } catch (FileNotFoundException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

pero funcionará sólo dentro de su IDE, no en JAR ejecutable. Tuve el mismo problema explicado here.

Cuestiones relacionadas