Java加载类路径上的文件(顺序加载+非顺序加载)和两种遍历方式

本文详细介绍了Java中使用Properties类和IO流加载配置文件的两种方式,对比了它们的输出顺序,解释了Properties类基于HashTable实现的原理,以及在实际项目中优先选择Properties的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、非顺序加载 (Properties加载方式)

  1. 新建普通java工程如下
    在这里插入图片描述

  2. 创建resource目录
    在这里插入图片描述

  3. 创建两份info文件,一份为properites,一份为txt, 文件内容如下
    在这里插入图片描述

  4. 整个工程目录如下

在这里插入图片描述

  1. 遍历方式1(通过集合Set方式)
public void showInfoByUtilSet() {
    	
    	InputStream stream = Loading.class.getResourceAsStream("/info.properties");
    	try {
    		Properties prop = new Properties();
			prop.load(stream);
			Set<Object> keySet =prop.keySet();
			for(Object b : keySet) {
				String key = (String) b;
				String value = prop.getProperty(key);
				System.out.println("key ="+key+" value="+value);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
``
  1. 遍历方式2(通过集合Enum方式)
public void showInfoByUtilEnum() {
    	InputStream stream = Loading.class.getResourceAsStream("/info.properties");
    	try {
    		Properties prop = new Properties();
			prop.load(stream);
			Enumeration<Object> keyEnum = prop.keys();
			while(keyEnum.hasMoreElements()) {
				String key = (String)keyEnum.nextElement();
				String value = prop.getProperty(key);
				System.out.println("key ="+key+" value="+value);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
  1. 两种方式输出结果:
    在这里插入图片描述
    注意
    1 两份属性文件的文件夹resource目录必须引入构建路径(build path)。
    2 加载文件的时候需要“/info.properties”,“/”表示从根目录开始寻找名字为info且后缀为properties的文件。

通过对比属性文件和输出结果我们可以看到,输出并不是按照输入的顺序来的,这是因为util 下的properties类 extends HashTable,HashTable是无序的。

二、顺序加载 (IO流读入方式)

  1. 示例代码
public class Loading1 {
	
	public static void main(String[] args){
		
		InputStream inputStream = Loading1.class.getResourceAsStream("/info.txt");
		InputStreamReader reader = new InputStreamReader(inputStream);
		BufferedReader bufferedReader = new BufferedReader(reader);
		String line = null;
		try {
			while( (line = bufferedReader.readLine()) != null) {
				StringTokenizer tokenizer = new StringTokenizer(line, "="); //以等号分割字符串
				String key = null;
				String value = null;
				if(line.trim().indexOf('#') == 0) { // 跳过以#开头的注解行
					continue;
				}
				while(tokenizer.hasMoreElements()) {
					key = tokenizer.nextToken();      //等号前的为key
					value = tokenizer.nextToken();    //等号后的为value
				}
				System.out.println("key =" + key +" value="+ value);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}
  1. 输出结果
    在这里插入图片描述
  2. 对比输入输出结果,采用IO流方式的时候输入输出是有序的,一行一行的读入。
  3. 两种方式比较:
    实际项目中以properties加载的居多,因为properties内部是以hashTable方式实现的,这种方式有个好处就是他是线程安全的。内部数据结构采用红黑树,查找和删除的效率更高。

三、总结

  1. Properties内部实现为HashTable, 存取为无序。
  2. HashTable线程安全,Properties和IO读取,优先选择properties读取。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值