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();
}
}
}
分享到:
相关推荐
1. **读取文件**:首先,工具类需要能够定位并打开配置文件。这通常通过`java.io.File`类实现,指定文件的绝对路径或相对路径。如果配置文件在网络服务器上,可能需要使用HTTP或FTP客户端库来获取。 2. **解析文件*...
本话题将详细介绍如何使用C#封装`log4net`类以及配置文件,以便更方便地进行日志管理。 首先,`log4net.dll`是`log4net`的核心库,包含了各种日志记录器、布局器和Appender等组件。`log4net.dll.config`文件是用于...
这类配置文件通常包含了一系列参数设置,用于调整GPS接收器的行为,例如卫星搜索参数、定位算法参数等,以提升定位效率和精度。 配置文件`gps.conf`可能包含以下关键设置: 1. **服务器设置**:GPS接收器可能需要...
在Java开发中,Spring框架是应用最广泛的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器。...在实际开发中,应根据项目需求选择合适的方式,确保配置文件能被正确地加载和解析。
它们主要分为两类:全局配置文件和区域配置文件。全局配置文件如`CldConfig.ini`,涵盖了整个系统的通用设置,如屏幕分辨率、语言选择、声音设置等;而区域配置文件如`CityCode.ini`则包含特定地区的地图信息和设置...
2. **增强可读性**:使每个配置文件聚焦于特定的功能模块,便于理解和定位问题。 3. **遵循软件工程原则**:“分而治之”的策略有助于模块化设计,便于团队分工合作。 #### 三、加载多个配置文件的方法 Spring ...
### 配置文件XML与XML公共类:深入解析与应用 在软件开发中,XML(Extensible Markup Language)被广泛用于存储和传输数据,尤其是在配置文件管理方面。它以其结构化、可扩展的特点,成为跨平台数据交换的标准格式...
在IT行业中,配置文件是应用程序的关键组成部分,它们存储着应用的设置、参数和偏好,使得程序可以根据用户的需求或环境变化动态调整行为。本资源提供的代码类专注于处理ini格式的配置文件,这是一种简单且广泛使用...
如果存在同名的配置文件,但位于不同的位置,根据Spring加载类路径资源的策略,可能会加载到一个错误的文件。为了避免这种情况,开发者需要仔细设计自己的目录结构,并确保配置文件的命名和位置唯一,以避免冲突。 ...
为了便于程序的安装和部署,这些配置文件通常被存放在程序的根目录下,或者根据类的包结构进行组织。例如,将数据库相关的配置文件`database.properties`放在与数据库操作类在同一包下的做法,可以提高代码的可维护...
2. **struts.xml**:Struts2框架的核心配置文件,它定义了Action类与URL的映射,处理请求的方式,结果页面的跳转规则,以及拦截器的配置。通过此文件,开发者可以控制应用程序的流程,实现MVC模式中的Controller层。...
【MyBatis 主配置文件详解】 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。与传统的 JDBC 相比,MyBatis 简化了手动设置参数和获取结果集的过程,通过 XML 或注解进行映射,将接口和 ...
接下来,我们将深入探讨SSM框架配置文件的相关知识点。 1. **Spring框架**:Spring作为Java企业级应用的核心框架,主要负责依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP...
根据提供的信息,我们可以深入探讨如何使用C#对配置文件(特别是`.config`文件)进行操作。这主要包括读取和修改配置文件中的值。下面将详细解释这些知识点。 ### .NET C# 对配置文件的操作 #### 概述 在.NET框架...
Spring通过`ClassPathXmlApplicationContext`或`FileSystemXmlApplicationContext`等类来读取配置文件。在标准的项目结构中,配置文件通常位于项目的`src/main/resources`目录下,这样Spring可以在类路径(ClassPath...
QSettings类可以方便地读写INI格式的配置文件,也可以与其他系统(如Windows注册表)交互。以下是使用QSettings的基本步骤: 1. **创建QSettings实例**: 在你的`MQConfig.cpp`文件中,首先需要创建一个QSettings...
《深入理解Log4j配置文件》 Log4j是一款广泛使用的日志记录框架,它为Java应用程序提供了灵活的日志管理功能。本篇文章将详细解析Lo4j配置文件,帮助开发者更好地理解和利用这一强大的工具。 一、Log4j的概述与...
CEGUI的配置文件是系统的核心部分,用于定义UI元素的行为、外观和布局。这些配置文件通常用XML语言编写,允许开发者通过文本编辑器来定制和扩展GUI系统。 在“自己写的CEGUI的配置文件”这个主题中,我们可以深入...
- **强大的查找和替换功能**:可以快速定位代码中的变量、函数和类,支持正则表达式搜索。 - **多语言支持**:不仅限于C/C++,还支持Java、C#等多种编程语言。 - **实时语法检查**:在编写代码时即时检查语法错误。 ...
2. **分析配置文件**:仔细研究新的配置文件,理解其中的参数含义,比如网络连接超时设置、并发处理能力、数据库连接池大小等,这些都可能影响刷卡速度。 3. **测试环境部署**:在非生产环境中部署新配置,进行充分...