zoukankan      html  css  js  c++  java
  • 文件读写

    1、开发配置文件

      在开发中经常会用到一些配置文件,便于在运行期间可以通过修改配置文件实现灵活的切换功能。而读取配置文件有很多方法,这些方法使用又会不一样。

    2、读取的方式

    2.1、项目结构

     config.json:

    {
      "env": "test",
      "port": "8088",
      "host": "127.0.0.1"
    }

    2.2、读取项目内的文件

    方法1:

    InputStream inputStream = getClass().getClassLoader().getResourceAsStream("config.json");
    EnvConfig envConfig = mapper.readValue(inputStream, EnvConfig.class);
    System.out.println("getClass().getClassLoader().getResourceAsStream() >>> " + mapper.writeValueAsString(envConfig));

    方法2:

    String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath() + "config.json";
    System.out.println("path >>> " + path); File file
    = new File(path); EnvConfig envConfigFile = mapper.readValue(file, EnvConfig.class); System.out.println("this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath() >>> " + mapper.writeValueAsString(envConfigFile));

    启动项目执行:

    getClass().getClassLoader().getResourceAsStream() >>> {"env":"test","port":"8088","host":"127.0.0.1"}

    path >>> /C:/demo-read-file/target/classes/config.json

    this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath() >>> {"env":"test","port":"8088","host":"127.0.0.1"}

    都能读取文件config.json。

    2.3、打成jar包运行(读取jar内部配置)

    打成jar包后,运行jar包。调用接口后,方法1读取成功(绿色),方法2读取失败(红色):

     2.4、打成jar包运行(读取jar外部配置)

    jar包和配置在同一个目录下:

    config.json如下:

    {
      "env": "uat",
      "port": "8080",
      "host": "192.11.26.32"
    }

    读取外部同级config.json:

    FileInputStream inputStream = new FileInputStream(System.getProperty("user.dir") + File.separator + "config.json");
    //也可以读取成功
    //FileInputStream inputStream = new FileInputStream("config.json");
    EnvConfig envConfigOuter = mapper.readValue(inputStream, EnvConfig.class);
    System.out.println("outer FileInputStream() >>> " + mapper.writeValueAsString(envConfigOuter));

    启动jar:(user.dir是当前 java -jar 执行的目录)

    java -jar demo.read.file.jar

    运行结果:

     2.5、作为jar包被引用,读取其他项目配置

    2.5.1 支持.properties或.xml

        ObjectMapper mapper = new ObjectMapper();
    
        static final String[] PROPERTIES_FILE_NAMES = new String[]{"config.properties", "config.xml"};
    
        public void read() throws IOException {
            List<String> loadFiles = new ArrayList<>();
            for (int i$ = 0; i$ < PROPERTIES_FILE_NAMES.length; ++i$) {
                String resourceName = PROPERTIES_FILE_NAMES[i$];
                Enumeration urls = Demo.class.getClassLoader().getResources(resourceName);
                System.out.println(">>>>>>>>>>load file begin. resourceName:" + resourceName );
    
                while (urls.hasMoreElements()) {
                    Properties properties = new Properties();
                    URL url = (URL) urls.nextElement();
                    loadFiles.add(url.getFile());
                    InputStream input = null;
    
                    try {
                        URLConnection con = url.openConnection();
                        con.setUseCaches(false);
                        input = con.getInputStream();
                        if (resourceName.endsWith(".xml")) {
                            properties.loadFromXML(input);
                            System.out.println(">>>>>>>>>>load xml finished. properties:" + mapper.writeValueAsString(properties));
                        } else {
                            properties.load(input);
                            System.out.println(">>>>>>>>>>load other finished. properties:" + mapper.writeValueAsString(properties));
                        }
                    } finally {
                        if (input != null) {
                            input.close();
                        }
                    }
                }
            }
        }
    View Code

    2.5.1.1 支持.properties

    a、config.properties配置:

    userDesc=u8fd9u662fu4e00u4e2au5ba2u6237u7aefu914du7f6eu7684u7528u6237u4fe1u606f
    userSex=u7537
    userName=client_user

    b、打成jar包给另一个项目使用:

    >>>>>>>>>>load file begin. resourceName:config.properties
    >>>>>>>>>>load xml finished. properties:{"userDesc":"这是一个客户端配置的用户信息","userName":"client_user","userSex":"男"}

    2.5.1.2 支持.xml

    a、config.xml配置(如果是简单的key-value格式的,可以使用sun的 http://java.sun.com/dtd/properties.dtd 定义xml格式

    <?xml version="1.0" encoding="GBK"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
    <entry key="userDesc">这是一个客户端配置的用户信息</entry>
    <entry key="userName">client_user</entry>
    <entry key="userSex">男</entry>
    </properties>

    b、打成jar包给另一个项目使用:

    >>>>>>>>>>load file begin. resourceName:config.xml
    >>>>>>>>>>load xml finished. properties:{"userDesc":"这是一个客户端配置的用户信息","userName":"client_user","userSex":"男"}

    2.5.1.3 支持.xml(复杂格式的配置)

    1、自定义xml格式;

    2、InputStream inputStream = Demo.class.getClassLoader().getResourceAsStream("config.xml");

    3、从inputstream解析Document文档为对应的Object 。

    2.5.2 支持json格式的配置

    json配置: 

    {
        "userDesc": "u8fd9u662fu4e00u4e2au5ba2u6237u7aefu914du7f6eu7684u7528u6237u4fe1u606f",
        "userName": "client_user",
        "userSex": "male",
        "address": {
            "province": "u4e0au6d77u5e02",
            "city": "u4e0au6d77u5e02",
            "area": "u5f90u6c47u533a",
            "detail": "u5929u94a5u6865u8defu0031u0036u0038u0038u5f04"
        }
    }
    InputStream resourceAsStream = Demo.class.getClassLoader().getResourceAsStream(resourceName);
    UserInfoConfig userInfoConfig = mapper.readValue(resourceAsStream, UserInfoConfig.class);

    执行结果:

  • 相关阅读:
    Opencv 中透视变换函数对IplImage图像变换时出现的问题?
    algorithm ch15 FastWay
    LeetCode 151 reverse word in a string
    LeetCode 10 Regular Expression Match
    LeetCode the longest palindrome substring
    MS笔试中的一个关于函数返回的“小”题
    js数组
    js数据强转
    css居中问题
    html table
  • 原文地址:https://www.cnblogs.com/mr-yang-localhost/p/9011419.html
Copyright © 2011-2022 走看看