2012-05-22 4 views
15

속성 파일을 사용하여 응용 프로그램의 구성 값을 저장하고 있습니다. 인스턴스 중 하나에서 값을 xxx:yyy:zzz으로 저장해야합니다. 그렇게하면 콜론이 백 슬래시 \으로 이스케이프되어 속성 파일에 xxx\:yyy\:zzz 값이 표시됩니다.속성 파일에서 콜론 (:)을 어떻게 이스케이프합니까?

콜론 :Properties Java 클래스의 표준 구분 기호임을 알고 있습니다. 그러나 백 슬래시가 없으면 값을 저장해야합니다. \.

이 문제를 해결하는 방법에 대한 제안 사항이 있으십니까?

+1

:

여기 내 CustomProperties 클래스입니다.그렇지 않으면, 어떻게 "콜론"을 혼동하지 않고 속성 파일을 다시 읽을 수 있고 콜론은 키 값을 구분하는 데 사용할 수 있습니까? – ewernli

+0

StringWriter를 만들고, 속성 파일을 작성하고,''\ : "'을 찾기 위해 줄 단위로 버퍼를 이동하여 하나의':"'로 대체하십시오. 이것은 꽤 아니지만, 또 다시 당신이하려고하는 것은 너무 예쁘지 않습니다. – dasblinkenlight

+1

@BhavikAmbani '* 정규 표현식 사용'? * 정확하게 특성 파일을 저장할 때 정규 표현식을 지정할 기회를 얻었습니까? RE는 정확히 어떤 모양입니까? – EJP

답변

16

Properties 개체에 속성을 입력하고 store(...) 메서드를 사용하여 저장하십시오. 이 메소드는 필요한 이스케이프를 수행합니다. Java documentation는 말한다.

"... 키의 경우, 모든 공백 문자가 포함 된 또는 공백 문자를 후행 공백 문자를지도하는 요소의 앞에 \ 문자로 작성되지 않지만이하는 작성된다 앞에는 \ 문자를 사용하고, 키와 요소 문자 #,!, = 및는 앞의 백 슬래시와 함께 쓰여져 제대로로드되었는지 확인합니다. "

수동으로 파일을 만들거나 쓰려면 문자 만 수동으로 이스케이프 처리하면됩니다.


반대로 파일에 이스케이프 처리되지 않은 콜론 문자가 포함되도록하려면 운이 없으면됩니다. 이러한 파일은 형식이 잘못되어 Properties.load(...) 메서드를 사용하여 제대로로드되지 않습니다. 이 경로를 따라 가면 사용자 지정로드 및/또는 저장 방법을 구현해야합니다.

1

loadFromXMLstoreToXML을 사용하여 등록 정보 파일의 xml 변형을 사용하는 경우 문제가되지 않습니다.

+0

나는이 접근법도 좋아하지만 XML 형식은 noobs ("고객 등.")에 대해 읽기가 조금 더 어렵다. 나는 탈출하는 방법이 있어야한다고 생각한다. 또는 일부 utils를 사용하여 키 값 구분 기호를 선택한다. 지금 : 구분 기호로도 사용됩니다 ... –

2

우리는 며칠 전에이 질문에 답했습니다. URL을 값으로 사용하여 기존 속성 파일을 조작하고있었습니다.

그것은 위험 해하지만 속성 값 미만 40 자하는 경우 다음 대신 "저장"의 "목록"방법을 사용할 수 있습니다

http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html#list(java.io.PrintWriter)

우리는 JDK 코드 얼핏을했고

public void store(Properties props, String propertyFilePath) throws FileNotFoundException { 
    PrintWriter pw = new PrintWriter(propertyFilePath); 
    for (Enumeration e = props.propertyNames(); e.hasMoreElements();) { 
     String key = (String) e.nextElement(); 
     pw.println(key + "=" + props.getProperty(key)); 
    } 
    pw.close(); 
} 
5

나는 동일한 문제를 겪었습니다. 슬래시 /도 에 store() 메서드로 이스케이프 처리됩니다.

나는 내 자신의 CustomProperties 클래스 ( java.util.Properties를 확장)를 생성하고 customStore0() 방법 saveConvert()에 호출을 주석하여이 문제를 해결했다. 난 당신이 할 수없는 두려움

import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.util.Date; 
import java.util.Enumeration; 
import java.util.Properties; 

public class CustomProperties extends Properties { 
    private static final long serialVersionUID = 1L; 
    @Override 
    public void store(OutputStream out, String comments) throws IOException { 
     customStore0(new BufferedWriter(new OutputStreamWriter(out, "8859_1")), 
        comments, true); 
    } 
    //Override to stop '/' or ':' chars from being replaced by not called 
    //saveConvert(key, true, escUnicode) 
    private void customStore0(BufferedWriter bw, String comments, boolean escUnicode) 
      throws IOException { 
     bw.write("#" + new Date().toString()); 
     bw.newLine(); 
     synchronized (this) { 
      for (Enumeration e = keys(); e.hasMoreElements();) { 
       String key = (String) e.nextElement(); 
       String val = (String) get(key); 
       // Commented out to stop '/' or ':' chars being replaced 
       //key = saveConvert(key, true, escUnicode); 
       //val = saveConvert(val, false, escUnicode); 
       bw.write(key + "=" + val); 
       bw.newLine(); 
      } 
     } 
     bw.flush(); 
    } 
}