Foros del Web » Programación para mayores de 30 ;) » Java »

Descomprimir un archivo con Java

Estas en el tema de Descomprimir un archivo con Java en el foro de Java en Foros del Web. Tengo un problema al descomprimir un archivo .RAR con java. Estoy utilizando Junrar para poder hacerlo pero me sale este error. java.lang.NullPointerException at de.innosystec.unrar.Archive.readHeaders(Archive.ja va:234) ...
  #1 (permalink)  
Antiguo 26/11/2012, 08:35
Avatar de pierxo  
Fecha de Ingreso: septiembre-2012
Mensajes: 20
Antigüedad: 7 años, 2 meses
Puntos: 0
Descomprimir un archivo con Java

Tengo un problema al descomprimir un archivo .RAR con java. Estoy utilizando Junrar para poder hacerlo pero me sale este error.

java.lang.NullPointerException
at de.innosystec.unrar.Archive.readHeaders(Archive.ja va:234)
at de.innosystec.unrar.Archive.setFile(Archive.java:1 24)
at de.innosystec.unrar.Archive.<init>(Archive.java:10 8)
at de.innosystec.unrar.Archive.<init>(Archive.java:96 )
at Main.extractArchive(Main.java:71)
at Main.extractArchive(Main.java:39)
at Main.main(Main.java:58)

Exception in thread "main" java.lang.NullPointerException: mainheader is null
at de.innosystec.unrar.Archive.isEncrypted(Archive.ja va:194)
at Main.extractArchive(Main.java:78)
at Main.extractArchive(Main.java:39)
at Main.main(Main.java:58)


Este es mi codigo:


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.ZipEntry;

import javax.swing.JPopupMenu.Separator;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import de.innosystec.unrar.Archive;
import de.innosystec.unrar.exception.RarException;
import de.innosystec.unrar.rarfile.FileHeader;


public class Main {
public boolean accept(File dir, String extension) {
return dir.getName().endsWith(extension);
}

private static Log logger = LogFactory.getLog(Main.class
.getName());

public static void extractArchive(String archive, String destination) {
if (archive == null || destination == null) {
throw new RuntimeException("archivo y destino deben setearse");
}
File arch = new File(archive);
if (!arch.exists()) {
throw new RuntimeException("el archivo no existe: " + archive);
}
File dest = new File(destination);
if (!dest.exists() || !dest.isDirectory()) {
throw new RuntimeException(
"El destino debe existir y apuntar a un directorio: "
+ destination);
}
extractArchive(arch, dest);
}

public static void main(String[] args) {
if (args.length == 2) {
String path = "D:/dir";
File fi = new File(path);

// File[] listaObjetos = fi.listFiles();
// for (int i = 0; i < listaObjetos.length; i++) {
// if (new Main().accept(listaObjetos[i], ".pdf.cxsig")) {
// String res = listaObjetos[i].getPath();
// String file = res.substring(res.lastIndexOf('/') + 1, res.lastIndexOf('.')-4);
// File re = new File(file.concat(".rar"));
// listaObjetos[i].renameTo(re);
//
// System.out.println("Se encontro archivos rar: " + listaObjetos[i].getPath() + file);
// }
// }
extractArchive(args[0], args[1]);
} else {
System.out
.println("use: java -jar NombreJAR.jar <Origen> <Destino>");
}


}

public static void extractArchive(File archive, File destination) {

Archive arch = null;
try {
arch = new Archive(archive);
} catch (RarException e) {
logger.error(e);
} catch (IOException e1) {
logger.error(e1);
}
if (arch != null) {
if (arch.isEncrypted()) {
logger.warn("archive is encrypted cannot extreact");
return;
}
FileHeader fh = null;
while (true) {
fh = arch.nextFileHeader();
if (fh == null) {
break;
}
// if (fh.isEncrypted()) {
// logger.warn("file is encrypted cannot extract: "
// + fh.getFileNameString());
// continue;
// }
logger.info("extracting: " + fh.getFileNameString());
try {
if (fh.isDirectory()) {
createDirectory(fh, destination);
} else {
File f = createFile(fh, destination);
OutputStream stream = new FileOutputStream(f);
arch.extractFile(fh, stream);
stream.close();
}
} catch (IOException e) {
logger.error("error extracting the file", e);
} catch (RarException e) {
logger.error("error extraction the file", e);
}
}
}
}

private static File createFile(FileHeader fh, File destination) {
File f = null;
String name = null;
if (fh.isFileHeader() && fh.isUnicode()) {
name = fh.getFileNameW();
} else {
name = fh.getFileNameString();
}
f = new File(destination, name);
if (!f.exists()) {
try {
f = makeFile(destination, name);
} catch (IOException e) {
logger.error("error creating the new file: " + f.getName(), e);
}
}
return f;
}

private static File makeFile(File destination, String name)
throws IOException {
String[] dirs = name.split("\\\\");
if (dirs == null) {
return null;
}
String path = "";
int size = dirs.length;
if (size == 1) {
return new File(destination, name);
} else if (size > 1) {
for (int i = 0; i < dirs.length - 1; i++) {
path = path + File.separator + dirs[i];
new File(destination, path).mkdir();
}
path = path + File.separator + dirs[dirs.length - 1];
File f = new File(destination, path);
f.createNewFile();
return f;
} else {
return null;
}
}


private static void createDirectory(FileHeader fh, File destination) {
File f = null;
if (fh.isDirectory() && fh.isUnicode()) {
f = new File(destination, fh.getFileNameW());
if (!f.exists()) {
makeDirectory(destination, fh.getFileNameW());
}
} else if (fh.isDirectory() && !fh.isUnicode()) {
f = new File(destination, fh.getFileNameString());
if (!f.exists()) {
makeDirectory(destination, fh.getFileNameString());
}
}
}

private static void makeDirectory(File destination, String fileName) {
String[] dirs = fileName.split("\\\\");
if (dirs == null) {
return;
}
String path = "";
for (String dir : dirs) {
path = path + File.separator + dir;
new File(destination, path).mkdir();
}

}

public static boolean esPDF(ZipEntry arch){
if(arch.getName().endsWith("pdf"))
return true;
return false;
}
}

Si alguien podria ayudarme.

El nombre de mi .rar es sample95.pdf.rar. Orginial mente era sample95.pdf.cxsig

le cambio la ultima extension por un .rar he intente descomprimirlo

Gracias
  #2 (permalink)  
Antiguo 26/11/2012, 11:13
 
Fecha de Ingreso: octubre-2012
Mensajes: 25
Antigüedad: 7 años, 1 mes
Puntos: 3
Respuesta: Descomprimir un archivo con Java

Cita:
Iniciado por pierxo Ver Mensaje
Tengo un problema al descomprimir un archivo .RAR con java. Estoy utilizando Junrar para poder hacerlo pero me sale este error.

Código Java:
Ver original
  1.         at de.innosystec.unrar.Archive.readHeaders(Archive.java:234)
  2.         at de.innosystec.unrar.Archive.setFile(Archive.java:124)
  3.         at de.innosystec.unrar.Archive.<init>(Archive.java:108)
  4.         at de.innosystec.unrar.Archive.<init>(Archive.java:96)
  5.         at Main.extractArchive(Main.java:71)
  6.         at Main.extractArchive(Main.java:39)
  7.         at Main.main(Main.java:58)
  8.  
  9. Exception in thread "main" java.lang.NullPointerException: mainheader is null
  10.         at de.innosystec.unrar.Archive.isEncrypted(Archive.java:194)
  11.         at Main.extractArchive(Main.java:78)
  12.         at Main.extractArchive(Main.java:39)
  13.         at Main.main(Main.java:58)
  14.  
  15.  
  16. Este es mi codigo:
  17.  
  18.  
  19. import java.io.File;
  20. import java.io.FileOutputStream;
  21. import java.io.IOException;
  22. import java.io.OutputStream;
  23. import java.util.zip.ZipEntry;
  24.  
  25. import javax.swing.JPopupMenu.Separator;
  26.  
  27. import org.apache.commons.logging.Log;
  28. import org.apache.commons.logging.LogFactory;
  29.  
  30. import de.innosystec.unrar.Archive;
  31. import de.innosystec.unrar.exception.RarException;
  32. import de.innosystec.unrar.rarfile.FileHeader;
  33.  
  34.  
  35. public class Main {
  36.      public boolean accept(File dir, String extension) {
  37.             return dir.getName().endsWith(extension);
  38.         }
  39.      
  40.     private static Log logger = LogFactory.getLog(Main.class
  41.             .getName());
  42.  
  43.  public static void extractArchive(String archive, String destination) {
  44.         if (archive == null || destination == null) {
  45.             throw new RuntimeException("archivo y destino deben setearse");
  46.         }
  47.         File arch = new File(archive);
  48.         if (!arch.exists()) {
  49.             throw new RuntimeException("el archivo no existe: " + archive);
  50.         }
  51.         File dest = new File(destination);
  52.         if (!dest.exists() || !dest.isDirectory()) {
  53.             throw new RuntimeException(
  54.                 "El destino debe existir y apuntar a un directorio: "
  55.                     + destination);
  56.         }
  57.         extractArchive(arch, dest);
  58.         }
  59.  
  60.  public static void main(String[] args) {
  61.         if (args.length == 2) {
  62.             String path = "D:/dir";
  63.             File fi = new File(path);
  64.            
  65. //          File[] listaObjetos = fi.listFiles();
  66. //          for (int i = 0; i < listaObjetos.length; i++) {
  67. //              if (new Main().accept(listaObjetos[i], ".pdf.cxsig")) {
  68. //                  String res = listaObjetos[i].getPath();
  69. //                  String file = res.substring(res.lastIndexOf('/') + 1, res.lastIndexOf('.')-4);
  70. //                  File re = new File(file.concat(".rar"));
  71. //                  listaObjetos[i].renameTo(re);
  72. //                 
  73. //                 System.out.println("Se encontro archivos rar: " + listaObjetos[i].getPath() + file);
  74. //              }
  75. //       }
  76.             extractArchive(args[0], args[1]);
  77.         } else {
  78.             System.out
  79.                 .println("use: java -jar NombreJAR.jar <Origen> <Destino>");
  80.         }
  81.          
  82.        
  83. }
  84.      
  85.      public static void extractArchive(File archive, File destination) {
  86.  
  87.             Archive arch = null;
  88.             try {
  89.                 arch = new Archive(archive);
  90.             } catch (RarException e) {
  91.                 logger.error(e);
  92.             } catch (IOException e1) {
  93.                 logger.error(e1);
  94.             }
  95.             if (arch != null) {
  96.                 if (arch.isEncrypted()) {
  97.                 logger.warn("archive is encrypted cannot extreact");
  98.                 return;
  99.                 }
  100.                 FileHeader fh = null;
  101.                 while (true) {
  102.                 fh = arch.nextFileHeader();
  103.                 if (fh == null) {
  104.                     break;
  105.                 }
  106. //              if (fh.isEncrypted()) {
  107. //                  logger.warn("file is encrypted cannot extract: "
  108. //                      + fh.getFileNameString());
  109. //                  continue;
  110. //              }
  111.                 logger.info("extracting: " + fh.getFileNameString());
  112.                 try {
  113.                     if (fh.isDirectory()) {
  114.                     createDirectory(fh, destination);
  115.                     } else {
  116.                     File f = createFile(fh, destination);
  117.                     OutputStream stream = new FileOutputStream(f);
  118.                     arch.extractFile(fh, stream);
  119.                     stream.close();
  120.                     }
  121.                 } catch (IOException e) {
  122.                     logger.error("error extracting the file", e);
  123.                 } catch (RarException e) {
  124.                     logger.error("error extraction the file", e);
  125.                 }
  126.                 }
  127.             }
  128.             }
  129.      
  130.        private static File createFile(FileHeader fh, File destination) {
  131.             File f = null;
  132.             String name = null;
  133.             if (fh.isFileHeader() && fh.isUnicode()) {
  134.                 name = fh.getFileNameW();
  135.             } else {
  136.                 name = fh.getFileNameString();
  137.             }
  138.             f = new File(destination, name);
  139.             if (!f.exists()) {
  140.                 try {
  141.                 f = makeFile(destination, name);
  142.                 } catch (IOException e) {
  143.                 logger.error("error creating the new file: " + f.getName(), e);
  144.                 }
  145.             }
  146.             return f;
  147.             }
  148.        
  149.      private static File makeFile(File destination, String name)
  150.         throws IOException {
  151.     String[] dirs = name.split("\\\\");
  152.     if (dirs == null) {
  153.         return null;
  154.     }
  155.     String path = "";
  156.     int size = dirs.length;
  157.     if (size == 1) {
  158.         return new File(destination, name);
  159.     } else if (size > 1) {
  160.         for (int i = 0; i < dirs.length - 1; i++) {
  161.         path = path + File.separator + dirs[i];
  162.         new File(destination, path).mkdir();
  163.         }
  164.         path = path + File.separator + dirs[dirs.length - 1];
  165.         File f = new File(destination, path);
  166.         f.createNewFile();
  167.         return f;
  168.     } else {
  169.         return null;
  170.     }
  171.     }
  172.  
  173.      
  174.      private static void createDirectory(FileHeader fh, File destination) {
  175.             File f = null;
  176.             if (fh.isDirectory() && fh.isUnicode()) {
  177.                 f = new File(destination, fh.getFileNameW());
  178.                 if (!f.exists()) {
  179.                 makeDirectory(destination, fh.getFileNameW());
  180.                 }
  181.             } else if (fh.isDirectory() && !fh.isUnicode()) {
  182.                 f = new File(destination, fh.getFileNameString());
  183.                 if (!f.exists()) {
  184.                 makeDirectory(destination, fh.getFileNameString());
  185.                 }
  186.             }
  187.             }
  188.      
  189.      private static void makeDirectory(File destination, String fileName) {
  190.             String[] dirs = fileName.split("\\\\");
  191.             if (dirs == null) {
  192.                 return;
  193.             }
  194.             String path = "";
  195.             for (String dir : dirs) {
  196.                 path = path + File.separator + dir;
  197.                 new File(destination, path).mkdir();
  198.             }
  199.  
  200.     }
  201.      
  202.      public static boolean esPDF(ZipEntry arch){
  203.           if(arch.getName().endsWith("pdf"))
  204.              return true;
  205.      return false;
  206.      }
  207. }

Si alguien podria ayudarme.

El nombre de mi .rar es sample95.pdf.rar. Orginial mente era sample95.pdf.cxsig

le cambio la ultima extension por un .rar he intente descomprimirlo

Gracias
No puedo ayudarte, pero te pongo el código más legible
  #3 (permalink)  
Antiguo 27/11/2012, 10:05
Avatar de pierxo  
Fecha de Ingreso: septiembre-2012
Mensajes: 20
Antigüedad: 7 años, 2 meses
Puntos: 0
Respuesta: Descomprimir un archivo con Java

Solucione mi problema utilizando ZIP en vez de rar

Código Java:
Ver original
  1. public static boolean desempaquetarArchivosDeZip(String rutaZip,
  2.             String carpetaDestino) {
  3.        
  4.         boolean flag = false;
  5.  
  6.         try {
  7.             ZipInputStream entradaZip = new ZipInputStream(new FileInputStream(
  8.                     rutaZip));
  9.  
  10.             ZipEntry archivoSuelto = null;
  11.                    
  12.             while ((archivoSuelto = entradaZip.getNextEntry()) != null) {
  13.                 System.out.println("Archivo leido: " + archivoSuelto.getName());
  14.                 File nuevoArchivo = new File(carpetaDestino + File.separator
  15.                         + archivoSuelto.getName());
  16.                 FileOutputStream salida = new FileOutputStream(nuevoArchivo);
  17.  
  18.                 byte[] buffer = new byte[1024];
  19.                 int leido;
  20.  
  21.                 while ((leido = entradaZip.read(buffer, 0, buffer.length)) != -1) {
  22.                     salida.write(buffer, 0, leido);
  23.                 }
  24. salida.flush();
  25.                 salida.close();
  26.             }
  27.            
  28.  
  29.             entradaZip.close();
  30.             flag = true;
  31.            
  32.         } catch (FileNotFoundException e) {
  33.             e.printStackTrace();
  34.         } catch (IOException e) {
  35.             e.printStackTrace();
  36.         }
  37.  
  38.         return flag;
  39.     }

Etiquetas: descomprimir, jar, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 12:14.