`
no_bao
  • 浏览: 315900 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

java修改Properties文件,让输出格式与输入格式保持不变

    博客分类:
  • j2ee
阅读更多

 

 

 

在方法中调用

 

 

 

FileInputStream input = new FileInputStream("e:/input.properties");

       SafeProperties safeProp = new SafeProperties();

       safeProp.load(input);

       input.close();

       safeProp.addComment("New Comment");

       safeProp.put("New-Key", "New====Value");

       FileOutputStream output = new FileOutputStream("e:/output.properties");

       safeProp.store(output, null);

       output.close();

 

 

 

 

--------------------------------------------- SafeProperties类内容------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

package com.jianrc.util;

 

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import java.util.Properties;

 

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) {

// Get next line

String line = in.readLine();

// intract property/comment string

String intactLine = line;

if (line == null)

return;

 

if (line.length() > 0) {

 

// Find start of key

int len = line.length();

int keyStart;

for (keyStart = 0; keyStart < len; keyStart++)

if (whiteSpaceChars.indexOf(line.charAt(keyStart)) == -1)

break;

 

// Blank lines are ignored

if (keyStart == len)

continue;

 

// Continue lines that end in slashes if they are not comments

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);

// Advance beyond whitespace on new line

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();

}

 

// Find separation between key and value

int separatorIndex;

for (separatorIndex = keyStart; separatorIndex < len; separatorIndex++) {

char currentChar = line.charAt(separatorIndex);

if (currentChar == '\\')

separatorIndex++;

else if (keyValueSeparators.indexOf(currentChar) != -1)

break;

}

 

// Skip over whitespace after key if any

int valueIndex;

for (valueIndex = separatorIndex; valueIndex < len; valueIndex++)

if (whiteSpaceChars.indexOf(line.charAt(valueIndex)) == -1)

break;

 

// Skip over one non whitespace key value separators if any

if (valueIndex < len)

if (strictKeyValueSeparators.indexOf(line.charAt(valueIndex)) != -1)

valueIndex++;

 

// Skip over white space after other separators if any

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) : "";

 

// Convert then store key and value

key = loadConvert(key);

value = loadConvert(value);

//memorize the property also with the whold string

put(key, value, intactLine);

} else {

//memorize the comment string

context.addCommentLine(intactLine);

}

} else {

//memorize the string even the string is empty

context.addCommentLine(intactLine);

}

}

}

 

/*

* Converts encoded &#92;uxxxx to unicode chars and changes special saved

* chars to their original forms

*/

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 entrys = context.getCommentOrEntrys();

for (Iterator 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);

}

 

/*

* Converts unicodes to encoded &#92;uxxxx and writes out any of the

* characters in specialSaveChars with a preceding slash

*/

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 commentOrEntrys = new ArrayList();

 

public List 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 void 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;

}

}

}

 

/**

* @param string

*/

public void addComment(String comment) {

if (comment != null) {

context.addCommentLine("#" + comment);

}

}

 

}


分享到:
评论

相关推荐

    改进java.util.Properties类,让输出格式与输入格式保持不变.

    这篇博客文章“改进java.util.Properties类,让输出格式与输入格式保持不变”探讨了如何解决这个问题。 首先,我们需要理解`Properties`类的工作原理。它使用`InputStream`和`OutputStream`来读取和写入属性文件。...

    读取以及修改properties文件

    在Java编程中,Properties文件是用于存储配置信息的文本文件,通常以.properties为扩展名。这些文件包含了应用程序运行时所需的键值对,如数据库连接字符串、API密钥或系统设置等。本篇将深入探讨如何读取和修改...

    java 改变Properties文件中的键值

    `Java.jpg`可能是一个与Java编程相关的图像,可能用于教程或说明,但在这个上下文中,它与修改Properties文件的操作没有直接关系。 总结来说,Java中修改Properties文件的键值涉及到使用`Properties`类的`load()`,...

    java properties文件中文转化

    此外,Java 8及以上版本的Properties类提供了新的API,允许直接指定输入流和输出流的字符编码,这也能有效解决编码问题。 总之,Java Properties文件中文转化是一个常见的编程问题,涉及到字符编码、Unicode转义等...

    java 读取properties文件代码

    在Java编程中,Properties文件是一种常用的配置文件格式,用于存储应用程序的配置参数或者环境设置。这些文件通常以键值对的形式存在,例如`key=value`。读取Properties文件是Java开发中的常见操作,特别是在需要...

    能保存Properties文件注释的Properties工具类

    在Java编程中,Properties类是用于处理属性列表的,这些属性列表通常以键值对的形式存储,例如配置文件。然而,标准的java.util.Properties类在加载和保存文件时会忽略注释,这在某些场景下可能不够理想。针对这个...

    JAVA 解决Properties文件保存中文乱码

    在Java编程中,Properties文件是用于存储配置信息的文本文件,通常包含键值对,其中键和值可以是任意字符串。然而,当这些文件中包含中文字符时,如果不正确地处理编码,可能会出现中文乱码的问题。本文将深入探讨...

    java读写properties配置文件

    ### Java读写Properties配置文件详解 #### 一、引言 在Java开发中,`Properties`类被广泛用于处理各种类型的配置文件。这些文件通常包含了应用程序运行时所需的配置信息,如数据库连接信息、系统参数等。`...

    java 动态修改Properties,src下或者指定路径

    在Java编程中,有时我们需要在运行时动态地修改配置文件,比如Properties文件。Properties文件是Java用来存储配置信息的一种常见方式,通常包含了应用的各种参数设置。然而,一旦将应用程序打包成JAR,内部的资源...

    java properties文件操作工具类,可追加修改

    此工具类只用于Java后端在操作Properties文件的时候写的工具类,方便properties文件的存取操作

    java对properties配置文件的读和写

    在Java编程中,`properties`文件是用于存储应用程序配置信息的一种简单文本格式。这些文件通常包含键值对,其中键和值之间用等号或冒号分隔。本篇文章将详细探讨如何在Java中读取、写入、修改以及删除`properties`...

    java实现properties文件读取

    这里的"config.properties"是Properties文件的路径,它应该与运行的Java类位于同一目录下,或者在类路径内。 3. **获取键值对**: 加载完文件后,可以通过键来获取对应的值。键和值都是字符串类型。 ```java ...

    Properties 文件比较工具

    4. **排序与格式**:虽然properties文件本身的顺序不重要,但工具可能会根据某种规则(如字母顺序)排序输出,以便更清晰地展示差异。 5. **注释处理**:properties文件中的行首#表示注释,比较时通常会忽略这些注释...

    利用Java的Properties 类读取配置文件信息

    Java提供了一个内置的`java.util.Properties`类,用于处理`.properties`文件,这种格式通常用来存储键值对,即键(key)和对应的值(value)。以下是如何利用`Properties`类读取和操作`.properties`文件的详细步骤。...

    Java读取properties文件的三种方式

    在Java编程中,读取properties文件是常见的任务,主要用于配置应用程序的参数或环境变量。properties文件通常以键值对的形式存储数据,便于管理和修改。本文将详细介绍三种在Java中读取properties文件的方法。 1. ...

    java解析Properties配置文件为对象Bean

    利用java的反射解析Properties文件转成对象 /** * 解析properties文件为对象 * @param * @param propPath * @param cls * @return * @throws InstantiationException * @throws ...

    用JAVA轻松操作properties文件

    在Java开发中,`properties`文件是一种常见的配置文件格式,主要用于存储一系列的键值对。它通常用于保存应用程序的各种配置信息,如数据库连接字符串、服务器地址等。Java提供了一个内置类`Properties`来方便地读取...

    java读写properties文件,解决系统找不到指定路径,解决写入后读取正常,但文件数据未更新问题

    首先,让我们看看如何在Java中正确地读取Properties文件。读取Properties文件通常分为以下几步: 1. 创建Properties对象:`Properties prop = new Properties();` 2. 指定文件路径:`String filePath = "path_to_...

    java读写properties文件,解决系统找不到指定路径,解决写入后读取正常,但文件数据未更新问题

    1. 相对类路径:如果你的Properties文件与Java源代码位于同一目录结构下,可以使用`getResourceAsStream()`方法,配合类路径来加载。例如: ```java InputStream in = getClass().getResourceAsStream("/config....

Global site tag (gtag.js) - Google Analytics