[開発][Tips] java-unrarの使い方について

先日お知らせしましたが、自作Androidアプリ「DOKUMAN」をアップデートしまして、RARファイルに対応しました。
その際、Javaで使えるrarライブラリについていろいろ調べて、何とか動くところまで持っていけたのでその対応メモ。

まず、Javaで使えるフリーのrarライブラリとして直ぐに見つかったのがjava-unrarです。
https://github.com/jukka/java-unrar

Alexander L. Roshalさんという方が作られたらしいですが、ライセンスをみても、フリーで使ってよくて、制限も特になさそうな記載でした。
ただ、製作が2010年ということで、ちょっと古いかな~と思って、他に何か無いかと探したところ、上のものをベースにした、こちらが見つかりました。
https://code.google.com/p/java-unrar/

どうも、もともとのjava-unrarに、暗号化機能を付け加えたもののようです。

どちらを使うかは暗号化が必要ならば後者、不要ならばどちらでも、ということでいいのだろうと思うのですが、何せ最大の欠点が、どちらもまともなドキュメントが添付されていません…orz
(原本のlicense.txtを読むと、「Winrar」と同じだから)

ということで、他のユーザーさんが掲示板に投げてる質問や、ブログで公開されてるサンプルなどを参考に
http://odasusu.hatenablog.com/entry/20091026/1256563688 (日本語)
https://community.x10hosting.com/threads/decompress-rar-file-in-java.104498/ (英語)
試行錯誤した結果を載せておきます。

まずはじめに、結論から言いますが、私の環境では、後者のほうは使えませんでした。
Eclipseで開発していますが、両者のライブラリは、Archiveクラスのコンストラクタの引数が異なっており、ライブラリを変更した際に、ソースの修正が必要になります。
そして、その修正を施し、ソースファイル内には、エラーを表示するマークは全て無くなった(プロジェクトの左側に×印はついていない)状態になったにもかかわらず、実行しようとすると、「プロジェクトのエラーを取り除かなければコンパイルできない」といわれました。
これの理由が、たとえばJavaのバージョンなど、開発環境に依存するものなのか、それとも、私のコーディングがまずいせいなのか、というところは正直、よくわかりません。
ただ、上のような理由で、動かすこと自体ができなかったため、一番大元のライブラリである java-unrar-0.5.jar のほうでのみ、動作確認しています。

ちなみに、私は今回、「解凍」のほうしか試しておりません。(自分のアプリに必要だったのがこちらだけだったので)
「圧縮」のほうはまた別の作法が何か必要なのかもしれませんが、そちらはご自身でお試し下さい。

それから、大元のGitHubサイト上では、ソースコードしか配布されていません。
もし、(私もそうしたのですが)jarファイルがほしいということであれば、 java-unrar-0.5.jar などのキーワードで検索すれば、ダウンロードできるサイトがぱらぱらと見つかりますので、適当に探して、DLしてください。
当初のものと同じままかどうか、というところがちょっと怖いところではありますが、インポートするときのパッケージネームもソースと同じだったし、そこは信用しよう、ということで…(というか、pom.xmlのプロジェクトのビルド方法がわからなかっただけなんですが…これって、どういう風にビルドすればよいのでしょうか?)


以下、私が作った解凍処理のソースと、ポイントです。
RARファイル形式を処理するためのクラスを作って、そのメソッドを外から呼び出す形で処理しました。
一部省略しますので、変数名など定義がない箇所もありますが了承下さい。


public class RarCtrl {

public List raredFileList=null; //rarFile内のファイルリストを保持する
private BufferedInputStream rarF = null; //Rarファイルのインプットバッファ

private Archive rarFile = null; //Rarファイル
private FileHeader rarFh[] = null; //Rarファイルのヘッダ情報
private String tempDir = null; //Cacheファイルのパス

/***
* コンストラクタで指定されたRarFile内に保存されているファイルのリストを、
* public static List raredFileList に設定する。
* @return 保存されていたファイルの数を返す。
*/
public int setInrarFileList(){
int fileNum=0;
rarFh=new FileHeader[rarFile.getFileHeaders().size()]; //RARファイルのヘッダーを取得
rarFile.getFileHeaders().toArray(rarFh);

raredFileList=new ArrayList();
for( int fileC=0; fileC

いろいろ消していたら、余りにも消しすぎて何やってんだかよくわからなくなってしまった感もありますが…
キモはここ
rarFile.extractFile(rarFh[i], fout); //この時点で、RARファイル内のファイルが解凍され、foutに保存される。
です。
foutの中にバッファが入っているのかと思って、これを直接いろいろ操作しようとしたんですが、このやり方はうまくいきませんでした。
で、調べたら、これを実行した時点ですでにファイルが作成され、解凍・保存までされているようだったので、いったんfoutはcloseして、新しいファイルとして対象ファイルを読込みなおすことで、あっさりとうまくいきました。


以上、参考になれば幸いです。

では~。

=======================気になる情報
ファレル・ウィリアムズ「Happy 」福島版公開。出演者、ロケ地など。

「韓国人が本当に思っていること」 - 韓国元外交通商部東北アジア局長・趙世暎

Androidアプリの配布パッケージapkの解析について

えっ?これも!?wordpressで制作されたハイクオリティWEBサイト100選!

諫早湾 長崎地裁は「開門したら制裁金」

児ポ改正案、漫画・アニメは除外

【成人男性による女装写真は児童ポルノなのか?】

この記事へのコメント

この記事へのトラックバック

テーマ別記事