`

FileUtil:获取jar所在目录

阅读更多

最近做一个企业应用,需要在项目打包后,生成的jar包所在目录生成一个临时目录。

开始,直接取了user.dir,可打包后发现出不对:user.dir为用户工作目录。

那么只能从class loading入手了,从加载资源class计算URL得到一个该目录(这样能得到结果,就是不知道有什么风险?我在windows和linux上测试过)。

我的FileUtil代码如下:

public class FileUtil {
	private static final Log logger = LogFactory.getLog(FileUtil.class);
	/**
	 * syslog应用程序被打包成为jar包发布。在syslog服务中,需要在jar文件位置创建临时文件夹,以保存数据。
	 * 临时文件夹:1 读文件中,ftp到中央日志服务的文件,被放到临时文件夹后再读。
	 * 			2 分析会后的日志,保存一个月。如果选择了备份,则把每天需要备份的文件移动到一个临时备份文件夹。
	 * 逻辑:如果getDirFromClassLoader()方法计算不出来path,就取System.getProperty("user.dir")用户工作目录
	 * */
	public static String getJarDir(){
		String path = getDirFromClassLoader();
		if(path == null){
			path = System.getProperty("user.dir");
		}
		return path;
	}
	
	/**
	 * 从通过Class Loading计算路径:
	 * 1 class文件通过jar包加载:
	 * 如果为jar包,该包为d:/test/myProj.jar
	 * 该方法返回d:/test这个目录(不受用户工作目录影响)
	 * 提示:在jar包加载 的时候,通过指定加载FileUtil的class资源得到jar:<url>!/{entry}计算出加载路径
	 * 2 class文件直接被加载:
	 * 如果是web工程,class文件放在D:\tools\apache-tomcat-5.5.27\webapps\webProj\WEB-INF\classes
	 * 该方法返回D:\tools\apache-tomcat-5.5.27\webapps\webProj\WEB-INF
	 * 即返回放class文件夹的上一层目录。
	 * */
	private static String getDirFromClassLoader(){
		try {
			String path = FileUtil.class.getName().replace(".", "/");
			path ="/"+path+".class";
			URL url=FileUtil.class.getResource(path);
			String jarUrl= url.getPath();
			if(jarUrl.startsWith("file:")){
				if(jarUrl.length()>5){
					jarUrl = jarUrl.substring(5);
				}
				jarUrl = jarUrl.split("!")[0];

			}else{
				jarUrl = FileUtil.class.getResource("/").toString().substring(5);
			}
			File file = new File(jarUrl);
			return file.getParent();
			
		} catch (Exception e) {
		}
		return null;
	}
	
	/**
	 * 找出指定目录及其子目录下,满足指定后缀的文件的绝对路径。
	 * 提示:方法中出现异常被内部捕获。
	 * @param dir 指定目录
	 * @param suffix 文件名后缀
	 * 
	 * @throws IllegalArgumentException 
	 * */
	public static List<String> find(String dir,String suffix){
		List<String> list = new ArrayList<String>();
		try {
			File file = new File(dir);
			if(file.exists() && file.isDirectory()){
				find(file, suffix, list);
			}else{
				throw new IllegalArgumentException("param \"dir\" must be an existing directory .dir = "+dir);
			}
		} catch (Exception e) {
			logger.error("gcw:find(dir,suffix) - "+e.getMessage());
		}
		return list;
	}
	/**
	 * 递归遍历,查找满足后缀的文件
	 * @param dirFile 必须为一个存在的目录.不能为null
	 * @param suffix
	 * @param list 递归遍历目录记录满足后缀的文件的绝对路径。
	 * */
	private static void find(File dirFile,String suffix,List<String> list){
		if(dirFile.exists() && dirFile.isDirectory()){
			File[] subFiles = dirFile.listFiles();
			for(File subFile : subFiles) {
				if(subFile.isDirectory()){
					find(subFile, suffix, list);
				}else{
					String path = subFile.getAbsolutePath();
					if(path.endsWith(suffix)){
						list.add(path);
					}
				}
			}
		}else{
			throw new IllegalArgumentException("param \"dir\" must be an existing directory .dir = "+dirFile.getAbsolutePath());
		}
	}
	
}
 

 

jar中加载资源不熟悉的,可以看看javaee的这个讨论:主题:深入jar包:从jar包中读取资源文件

分享到:
评论
9 楼 CapsLk 2009-12-15  
mxswl 写道
clazz.getProtectionDomain().getCodeSource().getLocation()

谢谢mxswl的提示! 这样拿到的URL直接可以getFile或者getPath得到文件系统的路径。我的做法太繁琐了。有时间在研究研究security 包。

关于new File("")与user.dir类似。
8 楼 nishizhutoua 2009-12-15  
理论上用class.getProtectionDomain().getCodeSource().getLocation().getFile();比较准.
不过有两个需要注意的:
1.返回如果是个文件说明是Jar包形式,返回的是jar,如果是目录说明是class,返回的是class所在的目录.
2.如果加载class的classLoder是一个自定义,那个这个方法很可能不支持,因为自定义的classLoder可能没有完成这部分功能.



7 楼 emuggle 2009-12-15  
您之前试过
new File("").getAbsolutePath()
吗?
6 楼 topcode 2009-12-15  
支持楼主造出一个热气腾腾的轮子!
5 楼 Foxswily 2009-12-15  
LZ就别重复造轮子了...
4 楼 mxswl 2009-12-15  
clazz.getProtectionDomain().getCodeSource().getLocation()
3 楼 vlinux 2009-12-15  
认真执行了一遍代码,发现还真是我理解错了。
好奇怪的需求,什么情况下需要这样呢?下次我碰到了也会用你这样的方法解决了
2 楼 CapsLk 2009-12-15  
vlinux 写道
这位大哥,您有没有试过如果什么路径都不指定,默认是在那个目录呢?
hahaha

你的class放在什么文件夹呢,就在那个目录。如果没有发生小概率事件,基本上不去取user.dir。
对于你的问题真么有看明白。
1 楼 vlinux 2009-12-14  
这位大哥,您有没有试过如果什么路径都不指定,默认是在那个目录呢?
hahaha

相关推荐

    一个关于文件、文件夹的创建删除类

    * FileUtil::createDir('a/1/2/3'); 测试建立文件夹 建一个a/1/2/3文件夹 * FileUtil::createFile('b/1/2/3'); 测试建立文件 在b/1/2/文件夹下面建一个3文件 * FileUtil::createFile('b/1/2/3.exe'); 测试建立...

    php创建删除目录操作类.zip

    测试复制文件 建立一个b/b文件夹,并把b/1/2文件夹中的3.exe文件复制进去 * FileUtil::moveDir('a/','b/c'); 测试移动文件夹 建立一个b/c文件夹,并把a文件夹下的内容移动进去,并删除a文件夹 * FileUtil::...

    go-fileutil:包 fileutil 实现了一些 File 实用程序功能

    包 fileutil 实现了一些 File 实用程序功能。 简单且无需陷入嵌套 if 语句地狱。使用 import fileutil "github.com/racklin/go-fileutil"文档例子检查文件是否存在 func Exists ( filename string ) ( bool , error ...

    fileutil:我写的 Golang 文件读写实用程序

    /* * Reads a file line by line into a channel * * c := fileutil.ReadLinesChannel(fileName) * for line := range c { * fmt.Printf(" Line: %s\n", line) * } */func ReadLinesChannel(fileName string) &lt;...

    FileUtil

    FileUtil

    PHP操作文件类(文件和文件夹创建,复制,移动和删除)

    FileUtil::createFile('b/1/2/3.txt', true); ``` ##### 3. `copyDir($source, $destination)` **功能描述:** 复制整个文件夹及其内容到另一个位置。 **参数说明:** - `$source`:源文件夹的完整路径。 - `$...

    关于文件操作的工具类 -- FileUtil

    public class FileUtil { /** * 新建目录 * @param folderPath String 如 c:/fqf * @return boolean */ public static void newFolder(String folderPath) { try { String filePath = folderPath; ...

    FileUtil.rar

    3. 运行:将编译后的可执行jar文件放在bin目录下,通过Java命令行运行,如`java -jar FileUtil.jar`,按照预设的参数启动服务。 五、注意事项 1. 确保上传的文件权限正确,以免出现权限不足导致的上传失败问题。 2....

    fileutil:简单的跨平台(cordova、node-webkit)文件读写API

    在cordova 下文件的根目录是cordova.file.dataDirectory ,在node-webkit 下是require('nw.gui').App.dataPath 。 cordova 实现取决于插件org.apache.cordova.file 。 应用程序接口 方法 范围 window.dica....

    FileUtil(文件操作工具类)

    在Java编程中,`FileUtil`通常是一个自定义的工具类,用于封装常见的文件操作,以便在项目中方便地处理文件。这个类可以提供一系列静态方法,帮助开发者执行读写文件、创建、删除、移动、复制文件等任务,极大地提高...

    FileUtil类文件整理

    在Java编程语言中,`FileUtil`类通常是由开发者自定义的一个工具类,用于封装对文件和目录的操作,以提供更便捷、安全的文件处理功能。这个类可能会包含各种静态方法,用来创建、读取、写入、删除、移动、复制文件...

    hadoop FileUtil.java 解决权限检查的问题

    org.apache.hadoop.fs.FileUtil.checkReturnValue(FileUtil.java:689) 解决这个问题后,重新生成的jar包

    Powerbuilder的文件操作函数、类库

    - `GetFileDateTime()`: 获取文件或目录的创建、修改或访问时间。 - `ChangeDirectory()`: 在目录间切换。 3. 类库: PowerBuilder提供了DataWindow对象,可以在其中集成文件操作。DataWindow不仅用于数据库操作...

    Xenos.zip_"blackbone" 使用_FileUtil.cpp:452:_Xenos 注入 使用_dll注入_saf

    本文将深入探讨“Xenos.zip”这个压缩包中的核心内容——一个基于“Blackbone”库开发的DLL注入工具,以及相关的“FileUtil.cpp:452”代码段。我们将讨论DLL注入的基本原理,Blackbone库的功能,以及安全性方面的...

    java 文件操作类

    通过`File`对象,我们可以创建、读取、写入、删除文件或目录,以及获取文件的属性信息。 2. **构造方法** 创建`File`对象时,通常使用以下构造方法: - `File(String path)`:根据指定的路径创建`File`对象。 - ...

    fileutil_2.10-1.0.0.zip

    在Java编程领域,反射机制是开发者们手中的一把神器,它允许程序在运行时动态地获取类的信息并调用其方法。本次我们将深入探讨Java反射机制,并结合开源项目“mirage.zip”中的“mirage-master”库,了解如何利用...

    java移动或复制文件夹:FileUtil

    java移动或复制文件夹:FileUtil

Global site tag (gtag.js) - Google Analytics