kikumotoのメモ帳

インフラ・ミドル周りを中心に、興味をもったことを適当な感じで。twitter : @takakiku

MogileFS を Java から使ってみる

MogileFS には非公式ではあるが Java クライアントもある。
今回は http://github.com/davidsheldon/java-mogilefs/tree/master にあるライブラリを利用してみることにした。

ファイルの読み書き

取得したファイルの中に、TestMogileFS.java というのがあるので、それを見るとだいたい使い方がわかる。

MogileFS にファイルを格納する場合を抜粋すると以下のような感じ。ちなみに、ここで SimpleMogileFSImpl を使ったのは PooleMogileFSImpl を使うと、newFile の呼び出しでなぜか時間がかかったから。commons-pool 側の問題のように見えたので、とりあえず SimpleMogileFSImpl で試してみたということ。

MogileFS mfs = new SimpleMogileFSImpl("mydomain", 
                                      new String[] { "192.168.251.61:6001" });
File file = nwe File("/path/to/file");
OutputStream out = mfs.newFile("filekey", "myclass", file.length());
FileInputStream in = new FileInputStream(file);
byte[] buffer = new byte[1024];
int count = 0;
while ((count = in.read(buffer)) >= 0) {
    out.write(buffer, 0, count);
}
in.close();
out.close();


読み込みは以下のような感じ。ちなみに TestMogileFS.java では MogileFS#getFileData なんてのを使うようなコードがコメントアウトされて書かれているけれど、そんなメソッドは存在していない。

File file = new File("/path/to/outputfile");
OutputStream out = new FileOutputStream(file);
InputStream in = mfs.getFileStream("filekey");
byte[] buffer = new byte[1024];
int count = 0;
while ((count = in.read(buffer)) >= 0) {
    out.write(buffer, 0, count);
}
in.close();
out.close();

bigfile オプションについて

どうやら、このライブラリでは PerlRuby のライブラリにある bigfile オプションのようなものはないみたい。

しかし、100MB を超えるようなファイルでもそのまま保存もできたし、そのファイルを mogtool から読み出すこともできてしまった。まだ、MogileFS の中まで理解していないので、はたしてこの動作は良いのか悪いのかわからない。

ちなみに、mogtool は mogtool 自身が 64MB 以上のファイルを bigfile オプションなしでは保存できないようにしている。