Java的项目(资源或者配置)文件的加载总结

首先我用的是Mac环境, Maven项目; 如图项目结构如下:

        

话不多说,上代码:

 先看   getClass().getResource

public void test1() throws IOException {
		
	System.out.println(this.getClass().getResource(""));
	//  file:/usr/eclipse/my_workspace/test.path/target/classes/com/test/sh/ 
	//  是类所在的 绝对路径  (就是类的包目录绝对路径)
		
        System.out.println(this.getClass().getResource("/"));
        //  file:/usr/eclipse/my_workspace/test.path/target/classes/
        //  项目的CLASSPATH 根目录
        
        System.out.println(this.getClass().getResource("/test.sh"));
        //  file:/usr/eclipse/my_workspace/test.path/target/classes/test.sh
        //  去项目的CLASSPATH 目录下 寻找文件
        
        System.out.println(this.getClass().getResource("/subfile/test22.sh"));
        //  file:/usr/eclipse/my_workspace/test.path/target/classes/subfile/test22.sh
        //  去项目的CLASSPATH 下 特定的目录寻找文件, 有几层写几层
        
	}

测试的结果是输出结果写在代码下面的注释里 ; 再看下   Class.getClassLoader().getResource(String path);

public void test2() {
    	//测试: Class.getClassLoader().getResource(String path);
    	
        System.out.println(this.getClass());    //输出: class com.test.sh.TestPath
        System.out.println(this.getClass().getClassLoader()); //输出: sun.misc.Launcher$AppClassLoader@4554617c
        
        System.out.println(this.getClass().getClassLoader().getResource("")); 
        //结果:  file:/usr/eclipse/my_workspace/test.path/target/classes/
        // 项目的CLASSPATH 根目录  
        
        System.out.println(this.getClass().getClassLoader().getResource("/"));  //结果:  null  说明这种不能以’/'开头时;
        System.out.println(this.getClass().getClassLoader().getResource("/test.sh"));  // 同样为空
        
        System.out.println(this.getClass().getClassLoader().getResource("test.sh"));
        //结果:  file:/usr/eclipse/my_workspace/test.path/target/classes/test.sh
        
        System.out.println(this.getClass().getClassLoader().getResource("subfile/test22.sh"));
        //结果:  file:/usr/eclipse/my_workspace/test.path/target/classes/subfile/test22.sh
    
	}
接下来是:

  public void test3() {
		System.out.println(System.getProperty("user.dir"));
		// 结果:/usr/eclipse/my_workspace/test.path
		//当前工程路径

	}

public void test4() {
		System.out.println(System.getProperty("java.class.path"));
		// 结果:/usr/eclipse/my_workspace/test.path/target/classes
		// 当前工程的 classpath 路径
	}

然后是: 

public void test5() throws IOException {
		File f   = new File( "test_class_getResourceAsStream.txt" );
		System.out.println( f.getAbsolutePath() );
		InputStream resourceAsStream = this.getClass().getResourceAsStream("/test.sh");
	    //	如果以 '/' 开头的,那么就会从classpath的根路径下开始查找指定的文件。
		inputstreamToFile( resourceAsStream, f );
	}

接着测试  Class.getResourceAsStreamClassLoader.getResourceAsStream :

public void test6() throws IOException {
		File f   = new File( "test_Class_getClassLoader_getResourceAsStream.txt" );
		InputStream resourceAsStream =  this.getClass().getClassLoader().getResourceAsStream("test22.sh");
		 //不能以 '/' 开头 ;   从classpath的根路径下开始查找指定的文件
		
		InputStream resourceAsStream2 =  this.getClass().getClassLoader().getResourceAsStream("subfile/test22.sh");
	        //不能以 '/' 开头 ;   从classpath的根路径下开始查找指定的文件。有几层写几层
		inputstreamToFile( resourceAsStream, f );
	}


	public static void inputstreamToFile(InputStream ins, File file) throws IOException {
		OutputStream os = new FileOutputStream(file);
		int bytesRead = 0;
		byte[] buffer = new byte[8192];
		while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
			os.write(buffer, 0, bytesRead);
		}
		os.close();
		ins.close();
	}


好了看了这么多代码的测试, 也是眼花缭乱, 不要急, 静下来总结的时候到了. 从结果来看:
【  this.getClass().getResource("/")  ==  this.getClass().getClassLoader().getResource("")

   Class.getResource和Class.getResourceAsStream在使用时路径选择上是一样的。


   Class.getClassLoader().getResource和Class.getClassLoader().getResourceAsStream在使用时路径选择上也是一样的。
我们可以总结到:
1. Class.getResourceAsStream(String path) :
     不以'/'开头时默认是从此类所在的包下取资源,以'/'开头则是从ClassPath 根下获取,多次目录时, 文件有几层写几层。
      跟源码发现其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
 
2. Class.getClassLoader.getResourceAsStream(String path) :
    默认则是从ClassPath根下获取,path不能以'/'开头,否则会报错;  多次目录时, 还是中间的子目录几层写几层
  
写在最后: 可以自己复制这些测试代码, 然后自己测试一下, 基本上这些文件在不同的位置怎么获取都了如指掌了! 您说呢.



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java程序可以使用Properties类来读取配置文件。Properties类是Java标准库中的一个类,它提供了一种简单的方式来读取和写入配置信息。 首先,我们需要创建一个Properties对象来加载配置文件。可以使用load()方法来读取文件,并将其加载到Properties对象中。例如,可以使用FileInputStream类将配置文件作为输入流来加载: ``` Properties properties = new Properties(); InputStream inputStream = new FileInputStream("config.properties"); properties.load(inputStream); ``` 在上述代码中,我们将配置文件"config.properties"作为输入流传递给Properties对象的load()方法来加载配置信息。 一旦配置文件加载到Properties对象中,我们可以使用getProperty()方法来获取特定的配置值。getProperty()方法接受属性的名称,并返回与之对应的属性值。例如,我们可以使用以下代码获取配置文件中的"username"属性的值: ``` String username = properties.getProperty("username"); ``` 上述代码将返回配置文件中"username"属性的值,并将其赋给字符串变量username。 同样地,我们也可以使用setProperty()方法来设置配置文件中的属性值。例如,我们可以使用以下代码在运行时修改配置文件中的"password"属性的值: ``` properties.setProperty("password", "new_password"); ``` 上述代码将把"password"属性的值设置为"new_password"。 最后,我们需要关闭输入流来释放资源。可以使用close()方法来关闭输入流: ``` inputStream.close(); ``` 通过上述步骤,我们可以轻松地使用Properties类来读取配置文件并获取其属性值,同时也可以修改配置文件中的属性值。这为Java程序的配置提供了方便和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值