JAVA加载properties文件

今天,我们细致的讲讲几乎所有的JAVA Coder都知道的classes和lib目录,以及如何加载properties文件。

首先你需要了解一下,我们的IDE-----Eclipse:

Eclipse 默认是看不见classes目录的,如果在WEB-INF下new一个classes文件夹话会报already exist!说明目录是存在的,可以设置一下让其显示出来。

Eclipse 默认是编译的修改文件,还记得那个Build Automatically选项吗?这个能保证你在修改文件并保存之后,能够将你修改的文件重新输出到classes目录中。一旦你取消这个选项,你就需要自己Build All。


另外,经常会看到某些大神在使用project->clean这个按钮,就是因为如果工作空间classes中的文件被删了或是其他的什么异常导致Elipse不知道,它就不会给你给你编译。导致Elipse源码明明是有这个文件的,而classes文件中却没有。这个时候使用clean就可以清除并重新编译整个项目。当然也可以在开启自动编译的时候修改目标文件并保存,Eclipse也会帮你重新放到classes中。


spring的文件配置中,我们经常会对classpath*:FileName.xml感到困惑,接下来我们解释一下这个classpath:

classpath就是指web-inf文件下的classes目录,而其中

classpath:只会到classes路径中查找
classpath*:不仅包含classes路径,还包括我们的jar文件(架包)中的classes路径进行查找


现在再来了解一下编译目录:

1、普通web项目编译完后,可以在工程路径/webapp/WEB-INF中看到classes和lib目录,我们称为编译输出目录
2、maven项目编译完后,是在工程路径/target中看到classes,而lib中的jar包是放在maven的本地仓库里。另外,maven项目可以通过install(右键项目run as-->maven install)命令来打包,执行成功后可以在target中看到以artifactId命名的一个war包和一个目录。请注意这不是您的编译输出目录,它只是一个打包结果,如果修改JAVA代码保存后,看不到改变,只有在target/classes中能看到。
3、tomcat并不是以您的编译输出目录作为项目发布路径,双击tomcat可以看到Server Locations选项,里面默认是以workspace\.metadata\.plugin\org.eclipse.wst.server.core\tmp0作为项目的发布路径,也可以由coder自己配置。在启动服务时,Eclipse会自动将编译输出目录中的代码放到这个路径中。通常包含META-INF、WEB-INF和web.xml这三个文件。


说了这么多,是想让读者搞清楚两点:
1、web项目直接运行main方法(Jetty也类似)和启动服务时的绝对路径是不一样的。前者是编译输出目录,后者是项目发布目录。
2、出现找不到目标文件的时候,去这几个目录看下,是否含有目标文件


然后进入正题,JAVA项目获取文件路径大致有一下几种方法:


package com.aikids.login.action;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;


public class TestPath {
	//静态代码块,当这个类被加载时会执行
	static{
		System.out.println("进入静态代码块~~");
		System.out.println("1:"+TestPath.class.getResource("").getPath());  
		System.out.println("2:"+TestPath.class.getResource("test.properties").getPath());
		System.out.println("3:"+TestPath.class.getClassLoader().getResource("").getPath());
		System.out.println("4:"+TestPath.class.getClassLoader().getResource("redis.properties").getPath());
		System.out.println("5:"+System.getProperty("user.dir"));
		System.out.println("6:"+ClassLoader.getSystemResource(""));
		
		InputStream is = TestPath.class.getClassLoader().getResourceAsStream("redis.properties");
		Properties p = new Properties();
		try {
			p.load(is);
			System.out.println(p.getProperty("redis.host"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

执行的结果:

main方法方式启动
进入静态方法~~
1:/D:/Temp_Workspace/kbtc/target/classes/com/aikids/login/action/
2:/D:/Temp_Workspace/kbtc/target/classes/com/aikids/login/action/test.properties
3:/D:/Temp_Workspace/kbtc/target/classes/
4:/D:/Temp_Workspace/kbtc/target/classes/redis.properties
5:D:\Temp_Workspace\kbtc

tomcat方式启动
进入静态代码块~~
1:/D:/apache-tomcat-7.0.52/wtpwebapps/kbtc/WEB-INF/classes/com/aikids/login/action/
2:/D:/apache-tomcat-7.0.52/wtpwebapps/kbtc/WEB-INF/classes/com/aikids/login/action/test.properties
3:/D:/apache-tomcat-7.0.52/wtpwebapps/kbtc/WEB-INF/classes/
4:/D:/apache-tomcat-7.0.52/wtpwebapps/kbtc/WEB-INF/classes/redis.properties
5:D:\开发环境\eclipse

首先说一下redis.properties是直接放在在classes文件目录下,test.properties是跟TestPath类放在一个包下。
总结:
1、您会发现两种方式的路径是完全不同,大体上(除开每种的最后两个),main方法是得到编译的输出目录,tomcat是得到项目发布目录
2、TestPath.class.getResource("").getPath()将会得到TestPath测试类的路径,如果将""替换成文件名字(可以加包名),可以在TestPath测试类下面去帮你找文件。
3、TestPath.class.getClassLoader().getResource("").getPath()将会得到classes路径,如果""替换成文件名字(可以加包名),可以在classes目录下面去帮你找文件。
4、System.getProperty("user.dir")在main启动方式是我的工作空间中的项目路径,tomcat启动方式是我Eclipse的安装路径,简单的来说就是在哪里执行java 命令,user.dir返回的就是哪里,实际工作中我们也根本用不到这种方式。


你可能感兴趣的:(问题,异常,杂项)