txt texto sobreescribir por modificar linea leer guardar datos como archivos archivo abrir java zip inputstream

texto - modificar archivos txt en java



¿Cómo leer un archivo desde ZIP usando InputStream? (3)

Debo obtener el contenido del archivo desde el archivo ZIP (solo un archivo, sé su nombre) usando SFTP. Lo único que tengo es el InputStream de ZIP. La mayoría de los ejemplos muestran cómo obtener contenido con esta declaración:

ZipFile zipFile = new ZipFile("location");

Pero como dije, no tengo un archivo ZIP en mi máquina local y no quiero descargarlo. ¿Es suficiente un InputStream para leer?

UPD: Así es como lo hago:

import java.util.zip.ZipInputStream; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; public class SFTP { public static void main(String[] args) { String SFTPHOST = "host"; int SFTPPORT = 3232; String SFTPUSER = "user"; String SFTPPASS = "mypass"; String SFTPWORKINGDIR = "/dir/work"; Session session = null; Channel channel = null; ChannelSftp channelSftp = null; try { JSch jsch = new JSch(); session = jsch.getSession(SFTPUSER, SFTPHOST, SFTPPORT); session.setPassword(SFTPPASS); java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); session.connect(); channel = session.openChannel("sftp"); channel.connect(); channelSftp = (ChannelSftp) channel; channelSftp.cd(SFTPWORKINGDIR); ZipInputStream stream = new ZipInputStream(channelSftp.get("file.zip")); ZipEntry entry = zipStream.getNextEntry(); System.out.println(entry.getName); //Yes, I got its name, now I need to get content } catch (Exception ex) { ex.printStackTrace(); } finally { session.disconnect(); channelSftp.disconnect(); channel.disconnect(); } } }


A continuación se muestra un ejemplo sencillo sobre cómo extraer un archivo ZIP, deberá verificar si el archivo es un directorio. Pero este es el más simple.

El paso que falta es leer la secuencia de entrada y escribir el contenido en un búfer que se escribe en una secuencia de salida.

// Expands the zip file passed as argument 1, into the // directory provided in argument 2 public static void main(String args[]) throws Exception { if(args.length != 2) { System.err.println("zipreader zipfile outputdir"); return; } // create a buffer to improve copy performance later. byte[] buffer = new byte[2048]; // open the zip file stream InputStream theFile = new FileInputStream(args[0]); ZipInputStream stream = new ZipInputStream(theFile); String outdir = args[1]; try { // now iterate through each item in the stream. The get next // entry call will return a ZipEntry for each file in the // stream ZipEntry entry; while((entry = stream.getNextEntry())!=null) { String s = String.format("Entry: %s len %d added %TD", entry.getName(), entry.getSize(), new Date(entry.getTime())); System.out.println(s); // Once we get the entry from the stream, the stream is // positioned read to read the raw data, and we keep // reading until read returns 0 or less. String outpath = outdir + "/" + entry.getName(); FileOutputStream output = null; try { output = new FileOutputStream(outpath); int len = 0; while ((len = stream.read(buffer)) > 0) { output.write(buffer, 0, len); } } finally { // we must always close the output file if(output!=null) output.close(); } } } finally { // we must always close the zip file. stream.close(); } }

Extracto del código provino del siguiente sitio:

http://www.thecoderscorner.com/team-blog/java-and-jvm/12-reading-a-zip-file-from-java-using-zipinputstream#.U4RAxYamixR


Bueno, he hecho esto:

zipStream = new ZipInputStream(channelSftp.get("Port_Increment_201405261400_2251.zip")); zipStream.getNextEntry(); sc = new Scanner(zipStream); while (sc.hasNextLine()) { System.out.println(sc.nextLine()); }

Me ayuda a leer el contenido de ZIP sin escribir en otro archivo.


El ZipInputStream es un InputStream por sí mismo y entrega el contenido de cada entrada después de cada llamada a getNextEntry() . Se debe tener especial cuidado, no para cerrar el flujo desde el que se lee el contenido, ya que es el mismo que el flujo ZIP:

public void readZipStream(InputStream in) throws IOException { ZipInputStream zipIn = new ZipInputStream(in); ZipEntry entry; while ((entry = zipIn.getNextEntry()) != null) { System.out.println(entry.getName()); readContents(zipIn); zipIn.closeEntry(); } } private void readContents(InputStream contentsIn) throws IOException { byte contents[] = new byte[4096]; int direct; while ((direct = contentsIn.read(contents, 0, contents.length)) >= 0) { System.out.println("Read " + direct + "bytes content."); } }

Al delegar el contenido de lectura a otra lógica, puede ser necesario envolver ZipInputStream con un FilterInputStream para cerrar solo la entrada en lugar de toda la secuencia como en:

public void readZipStream(InputStream in) throws IOException { ZipInputStream zipIn = new ZipInputStream(in); ZipEntry entry; while ((entry = zipIn.getNextEntry()) != null) { System.out.println(entry.getName()); readContents(new FilterInputStream(zipIn) { @Override public void close() throws IOException { zipIn.closeEntry(); } }); } }