Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.Reader;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.Properties;
- public class FormattedProperties extends Properties {
- @Override
- public synchronized void load(InputStream inStream) throws IOException {
- load0(new LineReader(inStream));
- }
- @Override
- public synchronized void load(Reader reader) throws IOException {
- load0(new LineReader(reader));
- }
- private void load0(LineReader lr) throws IOException {
- char[] convtBuf = new char[1024];
- int limit;
- int keyLen;
- int valueStart;
- char c;
- boolean hasSep;
- boolean precedingBackslash;
- while ((limit = lr.readLine()) >= 0) {
- c = 0;
- keyLen = 0;
- valueStart = limit;
- hasSep = false;
- //System.out.println("line=<" + new String(lineBuf, 0, limit) + ">");
- precedingBackslash = false;
- while (keyLen < limit) {
- c = lr.lineBuf[keyLen];
- //need check if escaped.
- if ((c == '=' || c == ':') && !precedingBackslash) {
- valueStart = keyLen + 1;
- hasSep = true;
- break;
- } else if ((c == ' ' || c == '\t' || c == '\f') && !precedingBackslash) {
- valueStart = keyLen + 1;
- break;
- }
- if (c == '\\') {
- precedingBackslash = !precedingBackslash;
- } else {
- precedingBackslash = false;
- }
- keyLen++;
- }
- while (valueStart < limit) {
- c = lr.lineBuf[valueStart];
- if (c != ' ' && c != '\t' && c != '\f') {
- if (!hasSep && (c == '=' || c == ':')) {
- hasSep = true;
- } else {
- break;
- }
- }
- valueStart++;
- }
- try {
- Method method = Properties.class.getDeclaredMethod("loadConvert", char[].class, int.class, int.class, char[].class);
- method.setAccessible(true);
- String key = (String) method.invoke(this, lr.lineBuf, 0, keyLen, convtBuf);
- String value = (String) method.invoke(this, lr.lineBuf, valueStart, limit - valueStart, convtBuf);
- put(key, value);
- } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
- e.printStackTrace();
- }
- }
- }
- class LineReader {
- public LineReader(InputStream inStream) {
- this.inStream = inStream;
- inByteBuf = new byte[8192];
- }
- public LineReader(Reader reader) {
- this.reader = reader;
- inCharBuf = new char[8192];
- }
- byte[] inByteBuf;
- char[] inCharBuf;
- char[] lineBuf = new char[1024];
- int inLimit = 0;
- int inOff = 0;
- InputStream inStream;
- Reader reader;
- int readLine() throws IOException {
- int len = 0;
- char c = 0;
- boolean skipWhiteSpace = true;
- boolean isCommentLine = false;
- boolean isNewLine = true;
- boolean appendedLineBegin = false;
- boolean precedingBackslash = false;
- boolean skipLF = false;
- while (true) {
- if (inOff >= inLimit) {
- inLimit = (inStream == null) ? reader.read(inCharBuf)
- : inStream.read(inByteBuf);
- inOff = 0;
- if (inLimit <= 0) {
- if (len == 0 || isCommentLine) {
- return -1;
- }
- if (precedingBackslash) {
- len--;
- }
- return len;
- }
- }
- if (inStream != null) {
- //The line below is equivalent to calling a
- //ISO8859-1 decoder.
- c = (char) (0xff & inByteBuf[inOff++]);
- } else {
- c = inCharBuf[inOff++];
- }
- if (skipLF) {
- skipLF = false;
- if (c == '\n') {
- continue;
- }
- }
- if (skipWhiteSpace) {
- if (c == '\t' || c == '\f') {
- continue;
- }
- if (!appendedLineBegin && (c == '\r' || c == '\n')) {
- continue;
- }
- skipWhiteSpace = false;
- appendedLineBegin = false;
- }
- if (isNewLine) {
- isNewLine = false;
- if (c == '#' || c == '!') {
- isCommentLine = true;
- continue;
- }
- }
- if (c != '\n' && c != '\r') {
- lineBuf[len++] = c;
- if (len == lineBuf.length) {
- int newLength = lineBuf.length * 2;
- if (newLength < 0) {
- newLength = Integer.MAX_VALUE;
- }
- char[] buf = new char[newLength];
- System.arraycopy(lineBuf, 0, buf, 0, lineBuf.length);
- lineBuf = buf;
- }
- //flip the preceding backslash flag
- if (c == '\\') {
- precedingBackslash = !precedingBackslash;
- } else {
- precedingBackslash = false;
- }
- } else {
- // reached EOL
- if (isCommentLine || len == 0) {
- isCommentLine = false;
- isNewLine = true;
- skipWhiteSpace = true;
- len = 0;
- continue;
- }
- if (inOff >= inLimit) {
- inLimit = (inStream == null)
- ? reader.read(inCharBuf)
- : inStream.read(inByteBuf);
- inOff = 0;
- if (inLimit <= 0) {
- if (precedingBackslash) {
- len--;
- }
- return len;
- }
- }
- if (precedingBackslash) {
- len -= 1;
- //skip the leading whitespace characters in following line
- skipWhiteSpace = true;
- appendedLineBegin = true;
- precedingBackslash = false;
- if (c == '\r') {
- skipLF = true;
- }
- } else {
- return len;
- }
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement