java获取配置文件信息

Wesley13
• 阅读 395

两个类

java获取配置文件信息 java获取配置文件信息

package com.censoft.util;

import java.util.Properties;

import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class SafeProperties extends Properties {
   private static final long serialVersionUID = 5011694856722313621L;

   private static final String keyValueSeparators = "=: \t\r\n\f";

   private static final String strictKeyValueSeparators = "=:";

   private static final String specialSaveChars = "=: \t\r\n\f#!";

   private static final String whiteSpaceChars = " \t\r\n\f";

   private PropertiesContext context = new PropertiesContext();

   public PropertiesContext getContext() {
       return context;
   }

   public synchronized void load(InputStream inStream) throws IOException {

       BufferedReader in;

       in = new BufferedReader(new InputStreamReader(inStream, "8859_1"));
       while (true) {
            String line = in.readLine();
            String intactLine = line;
           if (line == null)
               return;

           if (line.length() > 0) {

                int len = line.length();
               int keyStart;
               for (keyStart = 0; keyStart < len; keyStart++)
                   if (whiteSpaceChars.indexOf(line.charAt(keyStart)) == -1)
                       break;

                if (keyStart == len)
                   continue;

                char firstChar = line.charAt(keyStart);

               if ((firstChar != '#') && (firstChar != '!')) {
                   while (continueLine(line)) {
                       String nextLine = in.readLine();
                       intactLine = intactLine + "\n" + nextLine;
                       if (nextLine == null)
                           nextLine = "";
                       String loppedLine = line.substring(0, len - 1);
                        int startIndex;
                       for (startIndex = 0; startIndex < nextLine.length(); startIndex++)
                           if (whiteSpaceChars.indexOf(nextLine.charAt(startIndex)) == -1)
                               break;
                       nextLine = nextLine.substring(startIndex, nextLine.length());
                       line = new String(loppedLine + nextLine);
                       len = line.length();
                   }

                    int separatorIndex;
                   for (separatorIndex = keyStart; separatorIndex < len; separatorIndex++) {
                       char currentChar = line.charAt(separatorIndex);
                       if (currentChar == '\\')
                           separatorIndex++;
                       else if (keyValueSeparators.indexOf(currentChar) != -1)
                           break;
                   }

                    int valueIndex;
                   for (valueIndex = separatorIndex; valueIndex < len; valueIndex++)
                       if (whiteSpaceChars.indexOf(line.charAt(valueIndex)) == -1)
                           break;

                    if (valueIndex < len)
                       if (strictKeyValueSeparators.indexOf(line.charAt(valueIndex)) != -1)
                           valueIndex++;

                    while (valueIndex < len) {
                       if (whiteSpaceChars.indexOf(line.charAt(valueIndex)) == -1)
                           break;
                       valueIndex++;
                   }
                   String key = line.substring(keyStart, separatorIndex);
                   String value = (separatorIndex < len) ? line.substring(valueIndex, len) : "";

                    key = loadConvert(key);
                   value = loadConvert(value);
                    put(key, value, intactLine);
               } else {
                    context.addCommentLine(intactLine);
               }
           } else {
                context.addCommentLine(intactLine);
           }
       }
   }

  
   private String loadConvert(String theString) {
       char aChar;
       int len = theString.length();
       StringBuffer outBuffer = new StringBuffer(len);

       for (int x = 0; x < len;) {
           aChar = theString.charAt(x++);
           if (aChar == '\\') {
               aChar = theString.charAt(x++);
               if (aChar == 'u') {
                   // Read the xxxx
                   int value = 0;
                   for (int i = 0; i < 4; i++) {
                       aChar = theString.charAt(x++);
                       switch (aChar) {
                           case '0':
                           case '1':
                           case '2':
                           case '3':
                           case '4':
                           case '5':
                           case '6':
                           case '7':
                           case '8':
                           case '9':
                               value = (value << 4) + aChar - '0';
                               break;
                           case 'a':
                           case 'b':
                           case 'c':
                           case 'd':
                           case 'e':
                           case 'f':
                               value = (value << 4) + 10 + aChar - 'a';
                               break;
                           case 'A':
                           case 'B':
                           case 'C':
                           case 'D':
                           case 'E':
                           case 'F':
                               value = (value << 4) + 10 + aChar - 'A';
                               break;
                           default:
                               throw new IllegalArgumentException("Malformed \\uxxxx encoding.");
                       }
                   }
                   outBuffer.append((char) value);
               } else {
                   if (aChar == 't')
                       outBuffer.append('\t'); /* ibm@7211 */

                   else if (aChar == 'r')
                       outBuffer.append('\r'); /* ibm@7211 */
                   else if (aChar == 'n') {
                        /*
                         * ibm@8897 do not convert a \n to a line.separator
                         * because on some platforms line.separator is a String
                         * of "\r\n". When a Properties class is saved as a file
                         * (store()) and then restored (load()) the restored
                         * input MUST be the same as the output (so that
                         * Properties.equals() works).
                         *
                         */
                       outBuffer.append('\n'); /* ibm@8897 ibm@7211 */
                   } else if (aChar == 'f')
                       outBuffer.append('\f'); /* ibm@7211 */
                   else
                        /* ibm@7211 */
                       outBuffer.append(aChar); /* ibm@7211 */
               }
           } else
               outBuffer.append(aChar);
       }
       return outBuffer.toString();
   }

   public synchronized void store(OutputStream out, String header) throws IOException {
       BufferedWriter awriter;
       awriter = new BufferedWriter(new OutputStreamWriter(out, "8859_1"));
       if (header != null)
           writeln(awriter, "#" + header);
       List<Object> entrys = context.getCommentOrEntrys();
       for (Iterator<Object> iter = entrys.iterator(); 
            iter.hasNext();) {
           Object obj = iter.next();
           if (obj.toString() != null) {
               writeln(awriter, obj.toString());
           }
       }
       awriter.flush();
   }

   private static void writeln(BufferedWriter bw, String s) throws IOException {
       bw.write(s);
       bw.newLine();
   }

   private boolean continueLine(String line) {
       int slashCount = 0;
       int index = line.length() - 1;
       while ((index >= 0) && (line.charAt(index--) == '\\'))
           slashCount++;
       return (slashCount % 2 == 1);
   }

   private String saveConvert(String theString, boolean escapeSpace) {
       int len = theString.length();
       StringBuffer outBuffer = new StringBuffer(len * 2);

       for (int x = 0; x < len; x++) {
           char aChar = theString.charAt(x);
           switch (aChar) {
               case ' ':
                   if (x == 0 || escapeSpace)
                       outBuffer.append('\\');

                   outBuffer.append(' ');
                   break;
               case '\\':
                   outBuffer.append('\\');
                   outBuffer.append('\\');
                   break;
               case '\t':
                   outBuffer.append('\\');
                   outBuffer.append('t');
                   break;
               case '\n':
                   outBuffer.append('\\');
                   outBuffer.append('n');
                   break;
               case '\r':
                   outBuffer.append('\\');
                   outBuffer.append('r');
                   break;
               case '\f':
                   outBuffer.append('\\');
                   outBuffer.append('f');
                   break;
               default:
                   if ((aChar < 0x0020) || (aChar > 0x007e)) {
                       outBuffer.append('\\');
                       outBuffer.append('u');
                       outBuffer.append(toHex((aChar >> 12) & 0xF));
                       outBuffer.append(toHex((aChar >> 8) & 0xF));
                       outBuffer.append(toHex((aChar >> 4) & 0xF));
                       outBuffer.append(toHex(aChar & 0xF));
                   } else {
                       if (specialSaveChars.indexOf(aChar) != -1)
                           outBuffer.append('\\');
                       outBuffer.append(aChar);
                   }
           }
       }
       return outBuffer.toString();
   }

   /**
    * Convert a nibble to a hex character
    * @param nibble the nibble to convert.
    */
   private static char toHex(int nibble) {
       return hexDigit[(nibble & 0xF)];
   }

   /** A table of hex digits */
   private static final char[] hexDigit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
           'F' };

   public synchronized Object put(Object key, Object value) {
       context.putOrUpdate(key.toString(), value.toString());
       return super.put(key, value);
   }

   public synchronized Object put(Object key, Object value, String line) {
       context.putOrUpdate(key.toString(), value.toString(), line);
       return super.put(key, value);
   }


   public synchronized Object remove(Object key) {
       context.remove(key.toString());
       return super.remove(key);
   }

   class PropertiesContext {
       private List<Object> commentOrEntrys = new ArrayList<Object>();

       public List<Object> getCommentOrEntrys() {
           return commentOrEntrys;
       }

       public void addCommentLine(String line) {
           commentOrEntrys.add(line);
       }

       public void putOrUpdate(PropertyEntry pe) {
           remove(pe.getKey());
           commentOrEntrys.add(pe);
       }

       public void putOrUpdate(String key, String value, String line) {
           PropertyEntry pe = new PropertyEntry(key, value, line);
           remove(key);
           commentOrEntrys.add(pe);
       }

       public void putOrUpdate(String key, String value) {
           PropertyEntry pe = new PropertyEntry(key, value);
           int index = remove(key);
           commentOrEntrys.add(index,pe);
       }

       public int remove(String key) {
           for (int index = 0; index < commentOrEntrys.size(); index++) {
               Object obj = commentOrEntrys.get(index);
               if (obj instanceof PropertyEntry) {
                   if (obj != null) {
                       if (key.equals(((PropertyEntry) obj).getKey())) {
                           commentOrEntrys.remove(obj);
                           return index;
                       }
                   }
               }
           }
           return commentOrEntrys.size();
       }

       class PropertyEntry {
           private String key;

           private String value;

           private String line;

           public String getLine() {
               return line;
           }

           public void setLine(String line) {
               this.line = line;
           }

           public PropertyEntry(String key, String value) {
               this.key = key;
               this.value = value;
           }

           /**
            * @param key
            * @param value
            * @param line
            */
           public PropertyEntry(String key, String value, String line) {
               this(key, value);
               this.line = line;
           }

           public String getKey() {
               return key;
           }

           public void setKey(String key) {
               this.key = key;
           }

           public String getValue() {
               return value;
           }

           public void setValue(String value) {
               this.value = value;
           }

           public String toString() {
               if (line != null) {
                   return line;
               }
               if (key != null && value != null) {
                   String k = saveConvert(key, true);
                   String v = saveConvert(value, false);
                   return k + "=" + v;
               }
               return null;
           }
       }
   }


   public void addComment(String comment) {
       if (comment != null) {
           context.addCommentLine("#" + comment);
       }
   }

}

View Code

java获取配置文件信息 java获取配置文件信息

package com.censoft.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;

public class PropertyUtils {
    
    public static final String FILENAME ="solr.properties";
    
    /**
     * 根据KEY,读取文件对应的值 *
     * filePath 文件路径,即文件所在包的路径,例如:java/util/config.properties *
     */
    public static String getProp(String filename, String key) {
        try {
            SafeProperties safeProperty = new SafeProperties();
            String filepath = PropertyUtils.class.getClassLoader().getResource("/").getPath() + filename;
            
            File file = new File(filepath);
            InputStream in = new FileInputStream(file);
            safeProperty.load(in);
            in.close();
            String value = safeProperty.getProperty(key);
            return value;
        } catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
    
    /**
     * @param filename  文件名称
     * @param key    键
     * @param value    对应键需要修改的值
     */
    public static void setProp(String filename, String key, String value) {
        try {
            SafeProperties safeProperty = new SafeProperties();
            String filepath = PropertyUtils.class.getClassLoader().getResource("/").getPath() + filename;
            File file = new File(filepath);
            InputStream in = new FileInputStream(file);
            safeProperty.load(in);     // 一定要在修改值之前关闭fis
            in.close();
            OutputStream fos = new FileOutputStream(file);
            safeProperty.setProperty(key, value); // 保存,并加入注释
            safeProperty.store(fos, null);
            fos.flush();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 根据KEY,读取文件对应的值 *
     * filePath 文件路径,即文件所在包的路径,例如:java/util/config.properties *
     */
    public static String getProp(String key) {
        try {
            SafeProperties safeProperty = new SafeProperties();
            String filepath = PropertyUtils.class.getClassLoader().getResource("/").getPath() + FILENAME;
            
            filepath = filepath.replace("classes/", "");
            Reader inStream = new InputStreamReader(new FileInputStream(filepath), "UTF-8");
            safeProperty.load(inStream);
            
           /* File file = new File(filepath);
            InputStream in = new FileInputStream(file);
            safeProperty.load(in);*/
            inStream.close();
            String value = safeProperty.getProperty(key);
            return value;
        } catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
    
    /**
     * @param filename  文件名称
     * @param key    键
     * @param value    对应键需要修改的值
     */
    public static void setProp( String key, String value) {
        try {
            SafeProperties safeProperty = new SafeProperties();
            String filepath = PropertyUtils.class.getClassLoader().getResource("/").getPath() + FILENAME;
            filepath = filepath.replace("classes/", "");
            File file = new File(filepath);
            InputStream in = new FileInputStream(file);
            safeProperty.load(in);     // 一定要在修改值之前关闭fis
            in.close();
            OutputStream fos = new FileOutputStream(file);
            safeProperty.setProperty(key, value); // 保存,并加入注释
            safeProperty.store(fos, null);
            fos.flush();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

View Code

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Stella981 Stella981
2年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Easter79 Easter79
2年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
2年前
Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
!(https://oscimg.oschina.net/oscnet/3e08a942dd884e9ab82b63a1f3c4aada.jpg"未命名文件.jpg")Java技术栈不可错过的Java 技术公众号!(https://oscimg.oschina.net/oscnet/00fcff52518e
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这