top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
Jakarta Commons VFSを用いた極めて初歩的なトイプログラムを作成しました。ファイルの一覧およびファイルのコピーです。VFSベースなので、ローカルファイルとftp, そしてhttpとが透過的に相互乗り入れできるのが非常に興味深いです。
私がもっとも注目しているJava系オープンソースAPIのひとつが Jakarta Commons VFSです。さっそくとてもプリみぃてぃぶな検証プログラムを作成しました。
Jakarta Commons VFSを用いた ディレクトリ一覧を取得するためのトイプログラム・サンプルです。
確認に利用した動作環境
Sun Java2 SDK 1.5.0_03 (Windows版)
commons-vfs-1.0-RC1.jar
commons-logging.jar (1.0.4)
ftpの場合は 下記2ファイルが 実行時にクラスパスへの追加が必要です。
commons-net-1.4.0.jar
jakarta-oro-2.0.8.jar
※これらファイルがクラスパスに含まれていない場合には 読解しにくい例外が発生する場合があります。 例外のサンプル「org.apache.commons.vfs.FileSystemException: Could not list the contents of "ftp://ftp.jp.ibm.com/" because it is not a folder.」 VfsListSample.java
/*
* Jakarta Commons VSF: ファイル/ftp一覧の取得サンプル
* Copyright (C) 2005 伊賀敏樹 作成日: 2005/07/02
*/
import org.apache.commons.vfs.FileObject;
import org.apache.commons.vfs.FileSystemException;
import org.apache.commons.vfs.FileSystemManager;
import org.apache.commons.vfs.FileType;
import org.apache.commons.vfs.VFS;
/**
* @author Tosiki IGA
*/
public class VfsListSample {
public static void main(String[] args) {
try {
FileSystemManager manager = VFS.getManager();
FileObject fileObject = manager.resolveFile("file://c:/");
// FileObject fileObject = manager.resolveFile("ftp://ftp.jp.ibm.com/");
FileObject[] children = fileObject.getChildren();
for (int index = 0; index < children.length; index++) {
if (children[index].getType() == FileType.FOLDER) {
System.out.println("ディレクトリ:"
+ children[index].getName().getURI());
} else if (children[index].getType() == FileType.FILE) {
System.out.println("ファイル:"
+ children[index].getName().getURI());
} else if (children[index].getType() == FileType.IMAGINARY) {
System.out.println("イメージ:"
+ children[index].getName().getURI());
} else {
System.out.println("知らないファイル形式です: "
+ children[index].getName().getURI() + ": "
+ children[index].getType());
}
}
fileObject.close();
} catch (FileSystemException e) {
e.printStackTrace();
}
}
}
関連するリソース
Jakarta Commons VFS http://jakarta.apache.org/commons/vfs/
不明点 / TODO
FileObject#close()の呼び出しに関するルールについて調査が不足しています。というか現在のトイプログラムはバグっています。
FileObject#close()さへ呼び出せば、ストリームのclose()は呼び出し不要かも知れません。(ソースコードを見たら、それを示唆する感じに実装されています)
ファイル一覧については httpでは利用できない様子…
関連する日記
Jakarta Commons VFSを用いた ファイルをコピーするためのトイプログラム・サンプルです。
確認に利用した動作環境
Sun Java2 SDK 1.5.0_03 (Windows版)
commons-vfs-1.0-RC1.jar
commons-logging.jar (1.0.4) VfsCopySample
``` /*
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;
import org.apache.commons.vfs.FileObject; import org.apache.commons.vfs.FileSystemException; import org.apache.commons.vfs.FileSystemManager; import org.apache.commons.vfs.VFS;
/** * @author Tosiki IGA */ public class VfsCopySample { public static void main(String[] args) { InputStream inStream = null; OutputStream outStream = null; try { FileSystemManager manager = VFS.getManager(); FileObject fileObjectSrc = manager .resolveFile("http://homepage2.nifty.com/igat/igapyon/diary/index.html"); FileObject fileObjectDist = manager .resolveFile("file://c:/temp/work.txt");
System.out.println("ソース[" + fileObjectSrc.getURL() + "]をターゲット["
+ fileObjectDist.getURL() + "]にコピーします.");
if (fileObjectDist.exists()) {
System.out.println("ターゲットのファイル[" + fileObjectDist.getURL()
+ "]はすでに存在します.");
}
byte[] byteBuf = new byte[8192];
inStream = fileObjectSrc.getContent().getInputStream();
outStream = fileObjectDist.getContent().getOutputStream();
for (;;) {
int result = inStream.read(byteBuf, 0, byteBuf.length);
if (result <= 0) {
break;
}
outStream.write(byteBuf, 0, result);
}
outStream.flush();
fileObjectSrc.close();
fileObjectDist.close();
} catch (FileSystemException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
inStream.close();
outStream.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
} ```
IT Pro ニュース: MozillaベースのオープンソースHTMLエディタ「Nvu 1.0」正式リリース http://itpro.nikkeibp.co.jp/free/ITPro/NEWS/20050630/163728/ Nvuって、HTMLエディタだったのですね。ようやく認識しました。単に私の不勉強なのでしょう。
japan.linux.com : LinuxにRexxが必要な理由 http://japan.linux.com/desktop/05/06/30/0222227.shtml Rexxというプログラミング言語も 私は初耳です。さて、これも私の不勉強なのでしょう。