Using java to extract .rar files

extract, java, rar

Solution

You are able to extract `.gz`, `.zip`, `.jar` files as they use number of compression algorithms built into the Java SDK.

The case with RAR format is a bit different. RAR is a proprietary archive file format. RAR license does not allow to include it into software development tools like Java SDK.

The best way to unrar your files will be using 3rd party libraries such as junrar.

You can find some references to other Java RAR libraries in SO question RAR archives with java. Also SO question How to compress text file to rar format using java program explains more on different workarounds (e.g. using `Runtime`).

Problem

I am looking a ways to unzip `.rar` files using Java and where ever I search i keep ending up with the same tool - `JavaUnRar`. I have been looking into unzipping `.rar` files with this but all the ways i seem to find to do this are very long and awkward like in this example I am currently able to extract `.tar`, `.tar.gz`, `.zip` and `.jar` files in 20 lines of code or less so there must be a simpler way to extract `.rar` files, does anybody know? Just if it helps anybody this is the code that I am using to extract both `.zip` and `.jar` files, it works for both ``` public void getZipFiles(String zipFile, String destFolder) throws IOException { BufferedOutputStream dest = null; ZipInputStream zis = new ZipInputStream( new BufferedInputStream( new FileInputStream(zipFile))); ZipEntry entry; while (( entry = zis.getNextEntry() ) != null) { System.out.println( "Extracting: " + entry.getName() ); int count; byte data[] = new byte[BUFFER]; if (entry.isDirectory()) { new File( destFolder + "/" + entry.getName() ).mkdirs(); continue; } else { int di = entry.getName().lastIndexOf( '/' ); if (di != -1) { new File( destFolder + "/" + entry.getName() .substring( 0, di ) ).mkdirs(); } } FileOutputStream fos = new FileOutputStream( destFolder + "/" + entry.getName() ); dest = new BufferedOutputStream( fos ); while (( count = zis.read( data ) ) != -1) dest.write( data, 0, count ); dest.flush(); dest.close(); } } ```

Original source

Related problems