`
yiminghe
  • 浏览: 1460643 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

根据类定位配置文件

    博客分类:
  • java
阅读更多
import java.net.MalformedURLException;
import java.net.URL;
import java.io.File;
import java.io.IOException;
import java.security.ProtectionDomain;
import java.security.CodeSource;

/**
 * 这个类提供了一些根据类的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) {
                }

                //jar 内路径不需要
                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) {
            //jdk 自带类将 返回 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 {

                        // 使得结果 和   ClassLoader返回的 urlpath 相同
                        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) {
                    }
                }
            }
        }

        // //jdk 自带类 运行此函数
        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 {

            Class cls=MalformedURLException.class;
            ClassLoader clsLoader = cls.getClassLoader();
          URL  result = clsLoader != null ? clsLoader.getResource("")
                    : ClassLoader.getSystemResource("");


            System.out.println(getPathFromClass(Path.class));
            System.out.println(getFullPathRelateClass("../test/abc/..",
                    Path.class));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
 
分享到:
评论

相关推荐

    Java加载配置文件工具类

    1. **读取文件**:首先,工具类需要能够定位并打开配置文件。这通常通过`java.io.File`类实现,指定文件的绝对路径或相对路径。如果配置文件在网络服务器上,可能需要使用HTTP或FTP客户端库来获取。 2. **解析文件*...

    c# log4net封装类及配置文件

    本话题将详细介绍如何使用C#封装`log4net`类以及配置文件,以便更方便地进行日志管理。 首先,`log4net.dll`是`log4net`的核心库,包含了各种日志记录器、布局器和Appender等组件。`log4net.dll.config`文件是用于...

    gps配置文件,绝对可用

    这类配置文件通常包含了一系列参数设置,用于调整GPS接收器的行为,例如卫星搜索参数、定位算法参数等,以提升定位效率和精度。 配置文件`gps.conf`可能包含以下关键设置: 1. **服务器设置**:GPS接收器可能需要...

    spring读取jar中的配置文件

    在Java开发中,Spring框架是应用最广泛的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器。...在实际开发中,应根据项目需求选择合适的方式,确保配置文件能被正确地加载和解析。

    凯立德配置文件解析

    它们主要分为两类:全局配置文件和区域配置文件。全局配置文件如`CldConfig.ini`,涵盖了整个系统的通用设置,如屏幕分辨率、语言选择、声音设置等;而区域配置文件如`CityCode.ini`则包含特定地区的地图信息和设置...

    Spring 加载多个配置文件

    2. **增强可读性**:使每个配置文件聚焦于特定的功能模块,便于理解和定位问题。 3. **遵循软件工程原则**:“分而治之”的策略有助于模块化设计,便于团队分工合作。 #### 三、加载多个配置文件的方法 Spring ...

    配置文件Xml XMl公共类

    ### 配置文件XML与XML公共类:深入解析与应用 在软件开发中,XML(Extensible Markup Language)被广泛用于存储和传输数据,尤其是在配置文件管理方面。它以其结构化、可扩展的特点,成为跨平台数据交换的标准格式...

    配置文件读写的代码类 很容易看懂和使用

    在IT行业中,配置文件是应用程序的关键组成部分,它们存储着应用的设置、参数和偏好,使得程序可以根据用户的需求或环境变化动态调整行为。本资源提供的代码类专注于处理ini格式的配置文件,这是一种简单且广泛使用...

    Spring中使用classpath加载配置文件浅析

    如果存在同名的配置文件,但位于不同的位置,根据Spring加载类路径资源的策略,可能会加载到一个错误的文件。为了避免这种情况,开发者需要仔细设计自己的目录结构,并确保配置文件的命名和位置唯一,以避免冲突。 ...

    Java程序中的配置文件的存放和读取[文].pdf

    为了便于程序的安装和部署,这些配置文件通常被存放在程序的根目录下,或者根据类的包结构进行组织。例如,将数据库相关的配置文件`database.properties`放在与数据库操作类在同一包下的做法,可以提高代码的可维护...

    ssh整合的常用配置文件,包括所有配置文件,需要的童鞋进行下载。

    2. **struts.xml**:Struts2框架的核心配置文件,它定义了Action类与URL的映射,处理请求的方式,结果页面的跳转规则,以及拦截器的配置。通过此文件,开发者可以控制应用程序的流程,实现MVC模式中的Controller层。...

    MyBatis主配置文件

    【MyBatis 主配置文件详解】 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。与传统的 JDBC 相比,MyBatis 简化了手动设置参数和获取结果集的过程,通过 XML 或注解进行映射,将接口和 ...

    ssm框架配置文件

    接下来,我们将深入探讨SSM框架配置文件的相关知识点。 1. **Spring框架**:Spring作为Java企业级应用的核心框架,主要负责依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP...

    .net C# 对配置文件的操作

    根据提供的信息,我们可以深入探讨如何使用C#对配置文件(特别是`.config`文件)进行操作。这主要包括读取和修改配置文件中的值。下面将详细解释这些知识点。 ### .NET C# 对配置文件的操作 #### 概述 在.NET框架...

    如何加载jar包中的spring配置文件

    Spring通过`ClassPathXmlApplicationContext`或`FileSystemXmlApplicationContext`等类来读取配置文件。在标准的项目结构中,配置文件通常位于项目的`src/main/resources`目录下,这样Spring可以在类路径(ClassPath...

    MQConfig_qt读写配置文件_

    QSettings类可以方便地读写INI格式的配置文件,也可以与其他系统(如Windows注册表)交互。以下是使用QSettings的基本步骤: 1. **创建QSettings实例**: 在你的`MQConfig.cpp`文件中,首先需要创建一个QSettings...

    lo4j配置文件.rar

    《深入理解Log4j配置文件》 Log4j是一款广泛使用的日志记录框架,它为Java应用程序提供了灵活的日志管理功能。本篇文章将详细解析Lo4j配置文件,帮助开发者更好地理解和利用这一强大的工具。 一、Log4j的概述与...

    自己写的CEGUI的配置文件

    CEGUI的配置文件是系统的核心部分,用于定义UI元素的行为、外观和布局。这些配置文件通常用XML语言编写,允许开发者通过文本编辑器来定制和扩展GUI系统。 在“自己写的CEGUI的配置文件”这个主题中,我们可以深入...

    SourceInsight 安装文件 序列号以及配置文件

    - **强大的查找和替换功能**:可以快速定位代码中的变量、函数和类,支持正则表达式搜索。 - **多语言支持**:不仅限于C/C++,还支持Java、C#等多种编程语言。 - **实时语法检查**:在编写代码时即时检查语法错误。 ...

    解决龙管家刷卡慢配置文件。

    2. **分析配置文件**:仔细研究新的配置文件,理解其中的参数含义,比如网络连接超时设置、并发处理能力、数据库连接池大小等,这些都可能影响刷卡速度。 3. **测试环境部署**:在非生产环境中部署新配置,进行充分...

Global site tag (gtag.js) - Google Analytics