2007/09/09 更新
FastFile Ver.1.30 Copyright (C) 2001-2007 K.Takata 1.はじめに Java でファイルやディレクトリの属性を高速に取得できるようにするた めのライブラリです。 java.io.File で canRead(), lastModified(), length() などのメソッド を使ってファイルの属性を取得する場合、これらのメソッドが呼び出される たびに、毎回 stat() システムコールなどを使って OS からファイル属性を 取得します。そのため、java.io.File を使った場合には、常に最新の属性 が取得できることが保証されますが、速度的には非常に不利になります。 このライブラリでは、Windows ではディレクトリ内のファイル一覧を取得 するときに同時にファイルの属性も取得できるという性質を利用して、ファ イルの属性の取得を高速化します。特に、ファイル数の多いディレクトリを 扱う場合や遅いマシンには極めて大きな効果を発揮します。 2.動作環境 ○Java がインストールされている Windows 系の OS ・JNI を利用して非常に高速にファイル属性の取得ができます。 ○Java がインストールされている Windows 以外の OS ・JNI を利用しないものの、属性をキャッシュすることにより 2回目以降 は高速にファイル属性の取得ができます。 ○Java は Java 6 以降を推奨。(1.4 以降で使用可能。) 3.FastFile を利用したプログラムの作成方法 3.1. 記述方法 基本的に、FastFile は java.io.File と同じ使い方ができます。既存の プログラムで、File.listFiles() を利用してディレクトリ内のファイル一 覧を取得している場合には、FastFile.listFiles() を使うように変更する ことで、ファイル属性の取得を大幅に高速化することができます。例えば、 File dir = new Fast(dirname); File[] dirList = dir.listFiles(); という記述をしている場合、ファイルの先頭部分に import jp.ne.anet.kentkt.fastfile.*; という記述を加えた上で、先ほどの部分を File dir = new FastFile(dirname); File[] dirList = dir.listFiles(); と変更すれば、これ以降の部分で、dirList[] を使ってファイルの属性を取 得している場合には、それが大幅に高速化されます。 FastFile の詳しい使い方は、同梱の doc\index.html を参照してくださ い。 3.2. コンパイル方法 javac コマンドの -classpath オプションで、fastfile.jar の位置を指 定してコンパイルしてください。 例) > javac -classpath fastfile.jar dirlist.java 4.FastFile を利用したプログラムの実行方法 FastFile を利用した Java アプリケーションを実行するには、 FastFile.dll をカレントディレクトリまたはパスの通ったディレクトリに コピーし、fastfile.jar にクラスパスを通して実行してください。 例) > java -classpath .;fastfile.jar dirlist FastFile.dll がロードできなかった場合は、動作速度は低下しますが、 エラーなどは出さずにそのまま動作します。 Ver.1.20 からは、カレントディレクトリやパスの通ったディレクトリだ けでなく、fastfile.jar の置いてあるディレクトリも検索して、 FastFile.dll がロードされるようになりました。 5.サンプルプログラム dirlist.java, FileFormat.java は FastFile を利用したサンプルプログ ラムです。ディレクトリの中のファイル名一覧と各種属性を表示するプログ ラムです。3.2. の例のようにすればコンパイルできます。4.の例のよう にすれば実行できます。また、 > java -classpath .;fastfile.jar dirlist c:\windows\system32 のように実行すれば c:\windows\system32 のファイル一覧を表示します。 カレントディレクトリに FastFile.dll を置いた場合と置かない場合で、 FastFile と java.io.File の動作速度の違いを確認することができます。 速度の遅いマシンや、きわめて多くのファイルがあるディレクトリではその 違いが特に顕著に表れます。例えば、MMX Pentium 178MHz のマシンでファ イル数 10,000 のディレクトリを作成し、ファイル一覧の表示に掛かる時間 を計測したところ、java.io.File を使った場合には 580秒、FastFile を使 った場合には 2.5秒と、極めて大きな効果が現れました。 6.FastFile 自体のコンパイル方法 FastFile.dll は Visual C++ 6.0 を使ってコンパイルしています。また JDK 6 以降がインストールされている必要があります。そのほかに拙作の fjavac (*1) もインストールしておくことをお薦めします。VC++, JDK, fjavac にパスが通った状態で、src ディレクトリに移動してから、 > nmake -f FastFile.mak と入力すると、..\dest\ にクラスファイルと FastFile.dll が出力さ れ、..\doc\ にドキュメントが生成されます。 なお、FastFile.mak では JDK のインストール先として、c:\jdk1.6 を仮 定しています。JDK が他のディレクトリ(例えば C:\Program Files\Java\jdk1.6.0)にインストールされている場合は、 > nmake -f FastFile.mak "jdkhome=c:\Program Files\Java\jdk1.6.0" というように jdkhome= でインストール先を指定してください。 他のオプションとして javac= で Java のコンパイラを指定できます。 javac=fjavac と指定すれば、高速にコンパイルが行えるようになります。 (*1) http://homepage3.nifty.com/k-takata/mysoft/fjavac.html 7.更新履歴 2001/07/07 Ver.0.00 ・JF 用に開発。 2002/09/13 Ver.0.09 ・JF Ver.0.15 に同梱。 2004/06/08 Ver.0.09(改) ・暫定公開バージョン。 2004/06/16 Ver.1.00 ・最初の正式公開バージョン。 ・ライセンスを修正 BSD ライセンスに設定。 2004/12/09 Ver.1.10 ・Unicode ファイル名に対応。 ・(fastfile.jar は Ver.1.00 のまま。) 2005/07/29 Ver.1.11 ・FastFile.dll が動作しなくなっていた大バグを修正。(パッケージ を使用しない設定でコンパイルしたプライベート版を間違って公開し ていた。) ・FastFile.dll にバージョンリソースを付加。 ・(fastfile.jar は Ver.1.00 のまま。) 2006/02/11 Ver.1.20 ・fastfile.jar と同じディレクトリに、JNI モジュール (FastFile.dll) があれば、それをロードするようにした。 2007/08/28 Ver.1.21 (非公開) ・スレッドセーフにした。(マルチスレッドに対応) 2007/09/09 Ver.1.30 ・Win9x で unicows.dll を使わないようにした。(unicows.dll の浮 動小数点関連のバグで JavaVM が落ちる場合があったため。) ・setLastModified(), setReadOnly() などでファイルの属性を変更し た際に、該当する属性のキャッシュをクリアするように変更。 ・Java 6 で導入された、setWritable() などの属性変更関数に対応。 (Java 2 SE 1.5 以前で実行すると、false を返す。) ・Java 2 SE 1.3 以前を対応環境から外した。 8.注意事項、その他 ・このプログラムはフリーソフトウェアです。 ・ライセンスは、修正 BSD ライセンスとします。(license.txt 参照) 作者 : K.Takata(高田 謙) URL : http://webs.to/ken/ http://homepage3.nifty.com/k-takata/