⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 propertiesreader.java

📁 在Struts2中的jar包xwork的源代码.版本为2.0.7
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements.  See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License.  You may obtain a copy of the License at *  *      http://www.apache.org/licenses/LICENSE-2.0 *  * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.opensymphony.xwork2.util;import java.io.IOException;import java.io.LineNumberReader;import java.io.Reader;import java.io.StringWriter;import java.io.Writer;import java.util.ArrayList;import java.util.List;/** * This class is used to read properties lines. These lines do * not terminate with new-line chars but rather when there is no * backslash sign a the end of the line.  This is used to * concatenate multiple lines for readability. *  * This class was pulled out of Jakarta Commons Configuration and * Jakarta Commons Lang trunk revision 476093 */public class PropertiesReader extends LineNumberReader{    /** Stores the comment lines for the currently processed property.*/    private List commentLines;    /** Stores the name of the last read property.*/    private String propertyName;    /** Stores the value of the last read property.*/    private String propertyValue;    /** Stores the list delimiter character.*/    private char delimiter;        /** Constant for the supported comment characters.*/    static final String COMMENT_CHARS = "#!";        /** Constant for the radix of hex numbers.*/    private static final int HEX_RADIX = 16;    /** Constant for the length of a unicode literal.*/    private static final int UNICODE_LEN = 4;        /** The list of possible key/value separators */    private static final char[] SEPARATORS = new char[] {'=', ':'};    /** The white space characters used as key/value separators. */    private static final char[] WHITE_SPACE = new char[]{' ', '\t', '\f'};    /**     * Constructor.     *     * @param reader A Reader.     */    public PropertiesReader(Reader reader)    {        this(reader, ',');    }    /**     * Creates a new instance of <code>PropertiesReader</code> and sets     * the underlaying reader and the list delimiter.     *     * @param reader the reader     * @param listDelimiter the list delimiter character     * @since 1.3     */    public PropertiesReader(Reader reader, char listDelimiter)    {        super(reader);        commentLines = new ArrayList();        delimiter = listDelimiter;    }        /**     * Tests whether a line is a comment, i.e. whether it starts with a comment     * character.     *     * @param line the line     * @return a flag if this is a comment line     * @since 1.3     */    boolean isCommentLine(String line)    {        String s = line.trim();        // blanc lines are also treated as comment lines        return s.length() < 1 || COMMENT_CHARS.indexOf(s.charAt(0)) >= 0;    }    /**     * Reads a property line. Returns null if Stream is     * at EOF. Concatenates lines ending with "\".     * Skips lines beginning with "#" or "!" and empty lines.     * The return value is a property definition (<code>&lt;name&gt;</code>     * = <code>&lt;value&gt;</code>)     *     * @return A string containing a property value or null     *     * @throws IOException in case of an I/O error     */    public String readProperty() throws IOException    {        commentLines.clear();        StringBuffer buffer = new StringBuffer();        while (true)        {            String line = readLine();            if (line == null)            {                // EOF                return null;            }            if (isCommentLine(line))            {                commentLines.add(line);                continue;            }            line = line.trim();            if (checkCombineLines(line))            {                line = line.substring(0, line.length() - 1);                buffer.append(line);            }            else            {                buffer.append(line);                break;            }        }        return buffer.toString();    }    /**     * Parses the next property from the input stream and stores the found     * name and value in internal fields. These fields can be obtained using     * the provided getter methods. The return value indicates whether EOF     * was reached (<b>false</b>) or whether further properties are     * available (<b>true</b>).     *     * @return a flag if further properties are available     * @throws IOException if an error occurs     * @since 1.3     */    public boolean nextProperty() throws IOException    {        String line = readProperty();        if (line == null)        {            return false; // EOF        }        // parse the line        String[] property = parseProperty(line);        propertyName = unescapeJava(property[0]);        propertyValue = unescapeJava(property[1], delimiter);        return true;    }    /**     * Returns the comment lines that have been read for the last property.     *     * @return the comment lines for the last property returned by     * <code>readProperty()</code>     * @since 1.3     */    public List getCommentLines()    {        return commentLines;    }    /**     * Returns the name of the last read property. This method can be called     * after <code>{@link #nextProperty()}</code> was invoked and its     * return value was <b>true</b>.     *     * @return the name of the last read property     * @since 1.3     */    public String getPropertyName()    {        return propertyName;    }    /**     * Returns the value of the last read property. This method can be     * called after <code>{@link #nextProperty()}</code> was invoked and     * its return value was <b>true</b>.     *     * @return the value of the last read property     * @since 1.3     */    public String getPropertyValue()    {        return propertyValue;    }    /**     * Checks if the passed in line should be combined with the following.     * This is true, if the line ends with an odd number of backslashes.     *     * @param line the line     * @return a flag if the lines should be combined     */    private boolean checkCombineLines(String line)    {        int bsCount = 0;        for (int idx = line.length() - 1; idx >= 0 && line.charAt(idx) == '\\'; idx--)        {            bsCount++;        }        return bsCount % 2 == 1;    }    /**     * Parse a property line and return the key and the value in an array.     *     * @param line the line to parse     * @return an array with the property's key and value     * @since 1.2     */    private String[] parseProperty(String line)    {        // sorry for this spaghetti code, please replace it as soon as        // possible with a regexp when the Java 1.3 requirement is dropped        String[] result = new String[2];        StringBuffer key = new StringBuffer();        StringBuffer value = new StringBuffer();        // state of the automaton:        // 0: key parsing        // 1: antislash found while parsing the key        // 2: separator crossing        // 3: value parsing        int state = 0;        for (int pos = 0; pos < line.length(); pos++)        {            char c = line.charAt(pos);            switch (state)            {                case 0:                    if (c == '\\')                    {                        state = 1;                    }                    else if (contains(WHITE_SPACE, c))                    {                        // switch to the separator crossing state                        state = 2;                    }                    else if (contains(SEPARATORS, c))                    {                        // switch to the value parsing state                        state = 3;                    }                    else                    {                        key.append(c);                    }                    break;                case 1:                    if (contains(SEPARATORS, c) || contains(WHITE_SPACE, c))                    {                        // this is an escaped separator or white space                        key.append(c);                    }                    else                    {                        // another escaped character, the '\' is preserved                        key.append('\\');                        key.append(c);                    }                    // return to the key parsing state                    state = 0;                    break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -