속성 파일에서 등호 기호를 이스케이프하는 방법


84

=Java 속성 파일에서 등호 ( )를 어떻게 이스케이프 할 수 있습니까? 내 파일에 다음과 같은 내용을 넣고 싶습니다.

table.whereclause=where id=100

답변:


83

또한 javadoc의 클래스에서 load (Reader reader) 메소드를 참조하십시오.Property

에서 load(Reader reader)방법 문서가 말한다

열쇠는 최초의 비 공백 문자 및 최대 시작하는 줄의 문자를 모두 포함하고 있지만, 최초의 이스케이프를 포함하지 않는 '=', ':'또는 줄 끝 이외의 공백 문자를. 이러한 모든 키 종료 문자는 앞의 백 슬래시 문자로 이스케이프하여 키에 포함될 수 있습니다. 예를 들면

\:\=

두 문자 키가됩니다. ":=". 줄 종결 문자는 \r\n이스케이프 시퀀스를 사용하여 포함될 수 있습니다 . 키 뒤의 공백은 건너 뜁니다. 키 뒤의 공백이 아닌 첫 번째 문자가 '=' 또는 ':'이면 무시되고 그 뒤의 공백 문자도 건너 뜁니다. 행의 나머지 모든 문자는 연관된 요소 문자열의 일부가됩니다. 남은 문자가없는 경우 요소는 빈 문자열 ""입니다. 키와 요소를 구성하는 원시 문자 시퀀스가 ​​식별되면 위에서 설명한대로 이스케이프 처리가 수행됩니다.

도움이되기를 바랍니다.


89

특정 예에서는 등호를 이스케이프 할 필요가 없습니다. 키의 일부인 경우에만 이스케이프하면됩니다. 특성 파일 형식은 첫 번째 이스케이프 처리되지 않은 다음의 모든 문자를 값의 일부로 처리합니다.


12
이것이 마크 업되지 않은 이유를 모릅니다! 가장 간단한 정답! 그리고 대부분의 경우 사람들은 속성 파일에서 이스케이프 값을 찾고 있습니다!
Tejas 2013 년

1
작은 수정 : 이스케이프 처리되지 않은 첫 번째 같고 후행 공백, 즉 값의 선행 공백 이 제거 된 이후의 모든 문자를 으로 처리합니다. 예제 "myKey = my value"는 "myKey = my value"와 동일합니다.
Paulo Merson

23

Java의 기본 이스케이프 문자는 '\'입니다.
그러나 Java 속성 파일의 형식은 key = value이므로 첫 번째 이후의 모든 것을 값으로 간주해야합니다.


7
선행 공백 제외 (오와 키와 값 사이의 '='는 필요하지 않습니다. : 또는 공백 일 수 있습니다.)
Brad Cupit 2011

16

이러한 종류의 문제를 피하는 가장 좋은 방법은 프로그래밍 방식으로 속성을 빌드 한 다음 저장하는 것입니다. 예를 들어 다음과 같은 코드를 사용합니다.

java.util.Properties props = new java.util.Properties();
props.setProperty("table.whereclause", "where id=100");
props.store(System.out, null);

이것은 적절하게 이스케이프 된 버전을 System.out에 출력합니다.

제 경우 출력은 다음과 같습니다.

#Mon Aug 12 13:50:56 EEST 2013
table.whereclause=where id\=100

보시다시피 이것은 정확하다고 보장되는 .properties 파일의 콘텐츠를 생성하는 쉬운 방법입니다. 그리고 원하는만큼 많은 속성을 넣을 수 있습니다.


6

제 경우에는 두 개의 선행 '\\'가 잘 작동합니다.

예 : 단어에 '#'문자가 포함 된 경우 (예 : aa # 100) 두 개의 선행 '\\'로 이스케이프 할 수 있습니다.

   key= aa\\#100


두 번째로 두 개의 백 슬래시가 필요합니다 (glassfish 4.1, 빌드 13)
Susanta dec


2

Spring 또는 Spring 부트에서 application.properties 파일은 특수 문자를 이스케이프하는 방법입니다.

table.whereclause = where id '\ ='100


0

이 메서드는 .properties파일 과 100 % 호환되는 값을 프로그래밍 방식으로 생성하는 데 도움이됩니다 .

public static String escapePropertyValue(final String value) {
    if (value == null) {
        return null;
    }

    try (final StringWriter writer = new StringWriter()) {
        final Properties properties = new Properties();
        properties.put("escaped", value);
        properties.store(writer, null);
        writer.flush();

        final String stringifiedProperties = writer.toString();
        final Pattern pattern = Pattern.compile("(.*?)escaped=(.*?)" + Pattern.quote(System.lineSeparator()) + "*");
        final Matcher matcher = pattern.matcher(stringifiedProperties);

        if (matcher.find() && matcher.groupCount() <= 2) {
            return matcher.group(matcher.groupCount());
        }

        // This should never happen unless the internal implementation of Properties::store changed
        throw new IllegalStateException("Could not escape property value");
    } catch (final IOException ex) {
        // This should never happen. IOException is only because the interface demands it
        throw new IllegalStateException("Could not escape property value", ex);
    }
}

다음과 같이 부를 수 있습니다.

final String escapedPath = escapePropertyValue("C:\\Users\\X");
writeToFile(escapedPath); // will pass "C\\:\\\\Users\\\\X"

이 방법은 약간 비싸지 만 파일에 속성을 쓰는 것은 일반적으로 산발적 인 작업입니다.


-1

문자 ": 안에 값을 입력 할 수있었습니다.

db_user="postgresql"
db_passwd="this,is,my,password"

왜 반대 투표를해야합니까? 그것은 진짜 대답 :)입니다
russellhoff

Op는 Java 속성을 말하고 따옴표는 Java 속성 파일에서 그렇게 작동하지 않습니다.
teknopaul
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.