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



Este tema le ha gustado a 1 personas