JAVA之读取properties时路径的注意问题

 更新时间:2023年08月14日 14:17:02   作者:北渔。  
这篇文章主要介绍了JAVA之读取properties时路径的注意问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

JAVA读取properties时路径的注意

先来看看建立的测试工程目录

属性文件我们放在包test下,当然了,一般在实际开发过程中不建议这样做,建立把属性文件放在src目录下,现在放在包下主要是便于了解路径的问题。

下面来看一段读取属性文件的代码,属性文件配置了一个类Hello的K-V键值,我们要从中读取并加载到内存中来。

ReadProperties.properties

v=com.luhy.test.Hello

Hello类:

package com.luhy.test;
public class Hello {
	public void run(){
		System.out.println("Hello");
	}
}

ReadProperties.java

package com.luhy.test;
import java.util.Properties;
public class ReadProperties {
	public static void main(String[] args) throws Exception{
		String filename = "com/luhy/test/ReadProperties.properties";
		Properties props = new Properties();
		props.load(ReadProperties.class.getClassLoader().getResourceAsStream(filename));
		String h = props.getProperty("v");
		Object o = Class.forName(h).newInstance();
		Hello hello = (Hello)o;
		hello.run();
	}
}

执行完打印输出:

Hello

下面再来看一下编译后的bin目录

可见编译后属性文件被自动放到相应的包内,当然了,这里的bin相当于源码中的src,实际开发中一般放在此src目录下,这样在发布项目时就不用折腾了。

说明:

props.load(ReadProperties.class.getClassLoader().getResourceAsStream(filename));

意思是获得从Properties类获得类加载器(类加载器主要有四种,分别加载不同类型的类,加载只是把class文件放进内存,并没有产生对象),并把指定文件转化为流。

这一步,有很多新手,直接往load()里填文件名或具体文件路径名,程序运行时会报错找不到指定路径。

所以,一定要注意这点。

JAVA读取properties文件,中文出现乱码

问题的提出

初用properties,读取java properties文件的时候如果value是中文,会出现读取乱码的问题 

问题分析

开始以为是文件保存编码问题,把eclipse中所有的文件编码都修改成utf8,问题依然存在;

把内容复制到notepad++进行utf8编码转换,问题依旧;

上网搜索有人提议重写properties类或者用jdk自带的编码转换工具,嫌麻烦而且凭感觉jdk开发者不可能不考虑东亚几国的字符编码问题;

因为properties文件操作的代码是参考百度文库里的一边文章的,分析其代码后,发现其用的是字节流来读取文件,

具体代码如下: 

Properties properties = new Properties();  
InputStream inputStream = this.getClass().getResourceAsStream("/menu.properties");  
properties.load(inputStream );  
System.out.println(properties.getProperty("a"));  

因为字节流是无法读取中文的,所以采取reader把inputStream转换成reader用字符流来读取中文。

代码如下: 

Properties properties = new Properties();  
InputStream inputStream = this.getClass().getResourceAsStream("/menu.properties");  
BufferedReader bf = new BufferedReader(new    InputStreamReader(inputStream));  
properties.load(bf);  
System.out.println(properties.getProperty("a"));  

代码示例

1、工具类

/**
 * 读取配置文件Properties
 * 
 * @author xl
 *
 */
public class PropertiesUtil {
    private PropertiesUtil() {
    }
    private static class SingletonHolder {
        private final static PropertiesUtil instance = new PropertiesUtil();
    }
    public static PropertiesUtil getInstance() {
        return SingletonHolder.instance;
    }
    /**
     * 读取key字段,配置文件在classes根路径下xx.properties,在子路径下xx/xx.properties
     * 
     * @param file
     * @param key
     * @return
     */
    public String read(String file, String key) {
        InputStream in = getClass().getClassLoader().getResourceAsStream(file);
        BufferedReader bf = new BufferedReader(new InputStreamReader(in)); 
        Properties prop = new Properties();
        String value = "";
        try {
            prop.load(bf);
            value = prop.getProperty(key);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return value;
    }
}

2、使用工具类

/**
     * 获取properties文件中存放的数据
     * 
     * @param req
     * @param resp
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/getPropertiesData")
    @ResponseBody
    public Map<String, Object> getPropertiesData(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        Map<String, Object> returnMap = new HashMap<String, Object>();
        // 获取请求参数
        String key = (String) req.getParameter("key");
        String file = (String) req.getParameter("file");
        // 从配置文件读取key对应的value
        String value = PropertiesUtil.getInstance().read(file, key);
        returnMap.put("data", value);
        // 解析返回结果
        return returnMap;
    }

完!!!

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 深入了解Java File对象的使用

    深入了解Java File对象的使用

    这篇文章主要为大家详细介绍了Java中File对象的使用的相关资料,文中的示例代码讲解详细,对我们学习Java有一定的帮助,需要的可以参考一下
    2022-11-11
  • springboot依赖冲突问题及解决过程

    springboot依赖冲突问题及解决过程

    新搭了一个springboot 2.3.7.RELASE的框架,在集成mysql,tkMapper,mybatis的过程中,启动报错,怎么解决这个问题呢,下面小编给大家带来了springboot依赖冲突问题及解决过程,一起看看吧
    2021-09-09
  • maven 在执行package,install,deploy时使用clean与不使用clean的不同之处

    maven 在执行package,install,deploy时使用clean与不使用clean的不同之处

    有时候用mvn install后,新改的内容不生效,一定要后来使用mvn clean install 才生效,由于之前没有做记录,以及记不清是什么情况下才会出现的问题,于是想看看clean和不clean的区别,感兴趣的朋友跟随小编一起看看吧
    2021-08-08
  • SpringBoot中创建的AOP不生效的原因及解决

    SpringBoot中创建的AOP不生效的原因及解决

    这篇文章主要介绍了SpringBoot中创建的AOP不生效的原因及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Shiro 控制并发登录人数限制及登录踢出的实现代码

    Shiro 控制并发登录人数限制及登录踢出的实现代码

    本文通过shiro实现一个账号只能同时一个人使用,本文重点给大家分享Shiro 控制并发登录人数限制及登录踢出的实现代码,需要的朋友参考下吧
    2017-09-09
  • mybatisplus实现自动创建/更新时间的项目实践

    mybatisplus实现自动创建/更新时间的项目实践

    Mybatis-Plus提供了自动填充功能,可以通过实现MetaObjectHandler接口来实现自动更新时间的功能,本文就来介绍一下mybatisplus实现自动创建/更新时间的项目实践,感兴趣的可以了解下
    2024-01-01
  • 浅谈java中对集合对象list的几种循环访问

    浅谈java中对集合对象list的几种循环访问

    下面小编就为大家带来一篇java中对集合对象list的几种循环访问详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • Java的MD5工具类和客户端测试类

    Java的MD5工具类和客户端测试类

    这篇文章主要介绍了Java的MD5工具类和客户端测试类,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-12-12
  • Java网络编程三要素及通信程序详解

    Java网络编程三要素及通信程序详解

    这篇文章主要介绍了Java网络编程三要素及通信程序详解,Java网络编程是在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换,需要的朋友可以参考下
    2023-07-07
  • 详解Java对象结构与对象锁的升级

    详解Java对象结构与对象锁的升级

    这篇文章主要为大家详细介绍了Java对象结构与对象锁的升级,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03

最新评论