import java.io.*; import java.util.*; import java.util.zip.*; /** * クラスパスを使って、リソースファイルを検索します。 */ public class findres { /** * ディレクトリ内でリソースを探し、見つかればそのファイルを、 * 見つからなければ null を返します。 */ static File searchDir(File dir, String resource) { File f = new File(dir, resource); System.out.println("ディレクトリ \"" + dir + "\" の"); System.out.print("\tファイル \"" + f + "\""); if (f.exists()) { return f; } else { return null; } } /** * JAR (または ZIP) ファイル内でリソースを探し、見つかればそのエントリを、 * 見つからなければ null を返します。 */ static ZipEntry searchZip(ZipFile zip, String resource) { System.out.println("アーカイブ \"" + zip.getName() + "\" の"); System.out.print("\tエントリ \"" + resource + "\""); return zip.getEntry(resource); } /** * 指定したリソース名のリソースファイルを探します。 * 見つからなければ null を返します。 */ static Object find(String resource) { String classpath = System.getProperty("java.class.path"); String pathsep = File.pathSeparator; char filesep = File.separatorChar; System.out.println("クラスパス: " + classpath); System.out.println(); //クラスパスに指定されているディレクトリやアーカイブを、 //順番に検索していきます。 StringTokenizer tk = new StringTokenizer(classpath, pathsep); while (tk.hasMoreTokens()) { File file = new File(tk.nextToken()); if (file.exists()) { //検索を行ないます Object result = null; if (file.isDirectory()) { String filename = resource.replace('/', filesep); result = searchDir(file, filename); } else { try { result = searchZip(new ZipFile(file), resource); } catch (IOException e) { //このファイルは JAR (ZIP) アーカイブではない } } if (result != null) { System.out.println("...ありました."); return result; } else { System.out.println("...ありませんでした."); } } } return null; //最後まで見つからなかった場合 } //起動の仕方: 例) java findres java/awt/Frame.class public static void main(String[] args) { System.out.println("検索するリソース: " + args[0]); Object result = find(args[0]); System.out.println(); if (result != null) { System.out.println("見つかりました:" + result); } else { System.out.println("見つかりませんでした."); } } }