クラスのクラスの絶対パスコレクションを取得します.


クラスのクラスの絶対パスコレクションを取得します.    javaでは、常にいくつかのファイルの位置を特定し、プログラムが物理的な位置と関係がないように相対的なパスを使用します.しかし、javaでは相対的なパスを使うと、いつも厄介な問題があります.どの参照物に対しての問題ですか?私たちが普段使っている相対パスはいつも現在の作業ディレクトリに対して言っていますが、需要はそうではない場合があります.例えば、一つの開発パッケージで相対的なパスを使用するには、他のプログラムによって開発パッケージが呼び出された時の所在経路が分かりません.特にウェブアプリケーションでは、あるファイルがアプリケーション全体における相対的な経路を特定するのは難しいです.
    ですから、相対的な経路を使う一番いい方法はパスを相対的に参照することです.私の開発カバンやアプリケーション自体のものです.一番いいのは私が開発したカバンのクラスのクラスのクラスのクラスを使うことです.あるクラスファイルの絶対パスを知っていれば、それを参照物として、相対パスを使って他のファイルを特定することができます.
    この考えを実現するために、このPathクラスを書いて、このクラスは2つの静的公共方法を提供しています.一つはクラスのクラスクラスクラスのクラスのファイルの位置を特定するために、もう一つはある種類を参照物として相対的な経路を特定します.この二つの方法を使って、私たちはアプリケーションの現在の作業経路を全く気にしなくてもいいです.自分の位置によって任意の書類を探すことができます.例えば、ある機能的な開発パッケージを作成する時に、この開発パッケージを呼び出すアプリケーションの経路状況を全く気にせずに、開発パッケージの位置だけによってファイルを位置決めすると、パッケージ性がよく実現され、ファイルの経路処理は完全にオープンパッケージ自体に閉じられます.
以下はPathクラスのソースコードです.
 /*      2004-11-22
 *
 *           
 *    >     > Java >      >      
 */
package mytools;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.CodeSource;
import java.security.ProtectionDomain;

/**
 * @author   
 * 
 *             class          。
 */
public class Path {
 /**
  *       class         。       JDK    ,           ,            。
  *                ,        class       。
  * 
  * @param cls
  *                 Class  
  * @return     class         。           ,   null。
  */
 public static String getPathFromClass(Class cls) throws IOException {
  String path = null;
  if (cls == null) {
   throw new NullPointerException();
  }
  URL url = getClassLocationURL(cls);
  if (url != null) {
   path = url.getPath();
   if ("jar".equalsIgnoreCase(url.getProtocol())) {
    try {
     path = new URL(path).getPath();
    } catch (MalformedURLException e) {
    }
    int location = path.indexOf("!/");
    if (location != -1) {
     path = path.substring(0, location);
    }
   }
   File file = new File(path);
   path = file.getCanonicalPath();
  }
  return path;
 }

 /**
  *              class                    。                 ,    B/S   。
  *       ,                            。
  *   :  txt        Test       ../../resource/test.txt,
  *        Path.getFullPathRelateClass("../../resource/test.txt",Test.class)
  *       txt            。
  * 
  * @param relatedPath
  *                
  * @param cls
  *                  
  * @return             
  * @throws IOException
  *                         ,      IO  
  */
 public static String getFullPathRelateClass(String relatedPath, Class cls)
   throws IOException {
  String path = null;
  if (relatedPath == null) {
   throw new NullPointerException();
  }
  String clsPath = getPathFromClass(cls);
  File clsFile = new File(clsPath);
  String tempPath = clsFile.getParent() + File.separator + relatedPath;
  File file = new File(tempPath);
  path = file.getCanonicalPath();
  return path;
 }

 /**
  *     class     URL。             ,       。
  */
 private static URL getClassLocationURL(final Class cls) {
  if (cls == null)
   throw new IllegalArgumentException("null input: cls");
  URL result = null;
  final String clsAsResource = cls.getName().replace('.', '/').concat(
    ".class");
  final ProtectionDomain pd = cls.getProtectionDomain();
  // java.lang.Class contract does not specify
  // if 'pd' can ever be null;
  // it is not the case for Sun's implementations,
  // but guard against null
  // just in case:
  if (pd != null) {
   final CodeSource cs = pd.getCodeSource();
   // 'cs' can be null depending on
   // the classloader behavior:
   if (cs != null)
    result = cs.getLocation();

   if (result != null) {
    // Convert a code source location into
    // a full class file location
    // for some common cases:
    if ("file".equals(result.getProtocol())) {
     try {
      if (result.toExternalForm().endsWith(".jar")
        || result.toExternalForm().endsWith(".zip"))
       result = new URL("jar:".concat(
         result.toExternalForm()).concat("!/")
         .concat(clsAsResource));
      else if (new File(result.getFile()).isDirectory())
       result = new URL(result, clsAsResource);
     } catch (MalformedURLException ignore) {
     }
    }
   }
  }

  if (result == null) {
   // Try to find 'cls' definition as a resource;
   // this is not
   // document.d to be legal, but Sun's
   // implementations seem to //allow this:
   final ClassLoader clsLoader = cls.getClassLoader();
   result = clsLoader != null ? clsLoader.getResource(clsAsResource)
     : ClassLoader.getSystemResource(clsAsResource);
  }
  return result;
 }

 public static void main(String[] args) {
  try {
   System.out.println(getPathFromClass(Path.class));
   System.out.println(getFullPathRelateClass("../test/abc/..",
     Path.class));
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

 
 
本文はCSDNブログから来ました.転載は出所を明記してください.http://blog.csdn.net/youyue/archive/2005/03/22/326477.aspx.