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


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.