ClassLoader proporciona dos métodos para obtener recursos de la clase cargada:
URL pública GetResource (nombre de cadena); Public InputStream GetResourceASStream (nombre de cadena);
Aquí el nombre es el classpath del recurso, que es relativo a la ruta raíz "/". GetResource obtiene un objeto URL para localizar el recurso, y GetResourceASStream obtiene la referencia al flujo de entrada de recursos para garantizar que el programa pueda extraer datos de la ubicación correcta.
Pero lo que realmente usamos no son los métodos de carga de clases, sino los métodos GetResource y GetResourceasStream de la clase, porque el objeto de clase se puede obtener de su clase (como su clase Sin embargo, según la documentación de JDK, estos dos métodos del objeto de clase en realidad son "delegan" al cargador de clases que lo carga, por lo que solo necesita usar estos dos métodos del objeto de clase.
Por lo tanto, llame directamente a esto.getClass (). GetResourceasstream (nombre de cadena) para obtener el flujo y use classloader.getSystemresourCeasstream (nombre de cadena) en el método estático.
Aquí hay algunas formas de obtener el ClassPath y el camino absoluto a la clase actual. Es posible que deba utilizar algunos de estos métodos para obtener el camino absoluto a los recursos que necesita.
1.this.getClass (). GetResource ("")
Lo que obtienes es el directorio URI del archivo de clase actual. ¡No te incluye a ti mismo!
Por ejemplo: archivo:/d:/workspace/jbpmtest3/bin/com/test/
2.this.getClass (). GetResource ("/")
Lo que obtienes es la ruta URI absoluta de la classpath actual.
Por ejemplo: archivo:/d:/workspace/jbpmtest3/bin/
3.this.getClass () .getClassLoader (). GetResource ("")
Lo que obtienes es también la ruta URI absoluta del classpath actual.
Por ejemplo: archivo:/d:/workspace/jbpmtest3/bin/
4.ClassLoader.getSyMeMesurce ("")
Lo que obtienes es también la ruta URI absoluta del classpath actual.
Por ejemplo: archivo:/d:/workspace/jbpmtest3/bin/
5.Thread.CurrentThread (). GetContextClassLoader (). GetResource ("")
Lo que obtienes es también la ruta URI absoluta del classpath actual.
Por ejemplo: archivo:/d:/workspace/jbpmtest3/bin/
6.servletactionContext.getServletContext (). GetRealPath ("/")
En una aplicación web, obtenga la ruta absoluta al directorio raíz de la aplicación web. De esta manera, solo necesitamos proporcionar una ruta relativa al directorio raíz de la aplicación web para construir una ruta absoluta para ubicar los recursos.
Por ejemplo: archivo: /d:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/webproject
Nota:
1. Intente no usar la ruta relativa relativa a System.getProperty ("user.dir") Directorio de usuario actual. Esta es una bomba de tiempo que puede matarte en cualquier momento.
2. Intente usar recursos de ruta absoluta en forma de URI. Se puede convertir fácilmente en objetos URI, URL, archivo.
3. Intenta usar classpath relativo. No use rutas absolutas. Utilizando la URL estática pública getExtEnderResource (String RelativePath) de la clase ClassLoaderUtil anterior, ya puede localizar recursos en todas las ubicaciones utilizando la ruta relativa en relación con el classpath.
4. Absolutamente no use rutas absolutas codificadas. Porque, podemos usar el método getResource ("") de la clase de cargador de clases para obtener la ruta absoluta de la clase actual. Si tiene que especificar una ruta absoluta, ¡usar archivos de configuración también es mucho mejor que la codificación dura!
Cómo obtener un camino fuera de classpath:
Url base = this.getClass (). GetResource (""); // Primero obtenga la ubicación de esta clase, como/Home/Popeye/TestJava/Build/Classes/Net/
String path = new File (base.getFile (), ".../.../.../.../"+nombre) .getCanonicalPath (); // puede obtener/home/Popeye/testJava/nombre
Además, si comienza el programa desde Ant, el recuperado de este.getClass (). GetResource ("" es bastante extraño, y puede depurarlo con éxito con la línea de comandos Java.
Echemos un vistazo al método para obtener la classpath classpath en Java
He dicho mucho más, así que te publicaré el código clave directamente. El código específico es el siguiente:
<span style = "font-size: 18px;"> system.out.println ("++++++++++++++++++++++++++++++++++++++++++++++"); String stry = system.getproperty ("java.class.path"); string path2 = Freemarkerwriter.class.getProtectionDomain (). GetCodeSource (). GetLocation (). GetPath (); string path3 = freemarkerwriter.class.getprotectionDomain (). GetCodeSource (). GetLocation (). GetFile (); string path4 = Thread.currentThread (). GetContextClassLoader (). GetResource (""). GetPath (); system.out.println ("ruta 1 =" + ruta); system.out.println ("ruta 2 =" + ruta); system.println ("ruta 3 =" + path3); system.out.println ("ruta" + " +" + " +" + " +" + " +" + " path4); system.out.println ("++++++++++++++++++++++++++++++++++++++++++"); </span>Lo anterior es el código simple del método para obtener classpath classpath en Java presentado por el editor. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje. ¡El editor le responderá a tiempo!