2012-01-27 24 views
6

Tengo un objeto HttpServletResponse y necesito escribir un archivo contenido en el contenedor. Los siguientes segmentos de código no funcionan para mí.HttpServletResponse PrintWriter para escribir un InputStream

URI uri = <myclass>.class.getResource("/" + filename).toURI(); 
PrintWriter out = response.getWriter(); 
File f = new File(uri); 
FileReader bis = new FileReader(f); 
char[] buff = new char[1024]; 
int bytesRead; 
// Simple read/write loop. 
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { 
    out.write(buff, 0, bytesRead); 
} 

sé que esto va a funcionar

InputStream inputStream = <myclass>.class.getResourceAsStream("/" + filename); 

pero no puedo conseguir el out.write PrintStream para escribir el flujoEntrada.

¿Alguien me puede decir cómo se puede hacer esto.

Gracias

+0

lo siento, necesita leer un archivo que se encuentra dentro del frasco, un archivo de recursos. – user815809

Respuesta

4

resuelven utilizando el siguiente

InputStream inputStream = KCSSchemaController.class.getResourceAsStream("/" + schemaname); 

OutputStream output = response.getOutputStream(); 

ByteStreams.copy(inputStream, output); 

output.flush(); 
0

necesidad de escribir un archivo contenido en el frasco.

Eso no es posible de esta manera. Básicamente, necesitaría obtener una ruta de sistema de archivos de disco absoluta al archivo JAR, extraerlo usando JarInputStream (un JAR es básicamente un archivo ZIP que sigue una estructura de carpetas específica y recibe un tratamiento especial por Java), edite/agregue el archivo en la estructura de la carpeta extraída y luego empaquétela nuevamente usando JarOutputStream. Posiblemente necesitará volver a cargarlo luego usando un (personalizado) ClassLoader si necesita los contenidos JAR modificados más adelante durante el tiempo de ejecución.

Sin embargo, esto es bastante complicado y no tiene sentido. Como una alternativa completamente diferente, no intente cambiar el JAR, solo almacene los datos en otro lugar, p. en una ubicación fija en el sistema de archivos del disco, o en una base de datos, o como una preferencia de usuario/sistema, etcétera. La forma de elegir depende del requisito funcional concreto que no está claro en la pregunta.

+0

lo siento, necesito leer un archivo que está dentro del contenedor, un archivo de recursos. – user815809

+0

Si solo necesita * leer * (¡no para escribirlo!), Simplemente use 'ClassLoader # getResourseAsStream()' de la forma habitual. – BalusC

Cuestiones relacionadas