Cách thoát khỏi tệp thuộc tính đăng nhập bằng


84

Làm cách nào để thoát khỏi dấu bằng ( =) trong các tệp thuộc tính Java? Tôi muốn đặt một cái gì đó như sau trong tệp của mình:

table.whereclause=where id=100

Câu trả lời:


83

Hơn nữa, hãy tham khảo phương thức tải (Trình đọc Reader) từ Propertylớp trên javadoc

Trong load(Reader reader)tài liệu phương pháp nó nói

Chìa khóa chứa tất cả các ký tự trong dòng bắt đầu với nhân vật không gian không phải da trắng đầu tiên và lên đến, nhưng không bao gồm, các unescaped đầu tiên '=', ':'hoặc không gian nhân vật trắng khác hơn là một dòng terminator. Tất cả các ký tự kết thúc khóa này có thể được đưa vào khóa bằng cách thoát chúng bằng ký tự gạch chéo ngược đứng trước; ví dụ,

\:\=

sẽ là phím gồm hai ký tự Các ký tự ":=". kết thúc dòng có thể được bao gồm bằng cách sử dụng \r\nthoát chuỗi. Bất kỳ khoảng trắng nào sau khi khóa bị bỏ qua; nếu ký tự khoảng trắng đầu tiên sau khóa là '=' hoặc ':', thì nó sẽ bị bỏ qua và mọi ký tự khoảng trắng sau nó cũng bị bỏ qua. Tất cả các ký tự còn lại trên dòng trở thành một phần của chuỗi phần tử được liên kết; nếu không có ký tự nào còn lại, phần tử là chuỗi trống "". Khi các chuỗi ký tự thô cấu thành khóa và phần tử được xác định, xử lý thoát được thực hiện như mô tả ở trên.

Hy vọng rằng sẽ giúp.


89

Trong ví dụ cụ thể của bạn, bạn không cần phải thoát khỏi dấu bằng - bạn chỉ cần thoát nó nếu nó là một phần của khóa. Định dạng tệp thuộc tính sẽ coi tất cả các ký tự sau ký tự không thoát đầu tiên là một phần của giá trị.


12
không biết tại sao cái này vẫn chưa được đánh dấu! Câu trả lời đúng đơn giản nhất! Và hầu hết mọi người đều tìm kiếm giá trị thoát trong tệp thuộc tính!
Tejas

1
Sửa nhỏ: sẽ coi là giá trị của tất cả các ký tự sau dấu cách dấu bằng và dấu cách không thoát đầu tiên, nghĩa là, các khoảng trắng ở đầu giá trị được lấy ra. Ví dụ "myKey = my value" giống với "myKey = my value".
Paulo Merson

23

Ký tự thoát mặc định trong Java là '\'.
Tuy nhiên, tệp thuộc tính Java có định dạng key = value, nó phải được xem xét mọi thứ sau giá trị đầu tiên bằng.


7
ngoại trừ khoảng trắng hàng đầu (oh và '=' giữa khoá và giá trị là không cần thiết, nó có thể là: hoặc một không gian trống)
Brad Cupit

16

Cách tốt nhất để tránh loại vấn đề này là xây dựng các thuộc tính theo chương trình và sau đó lưu trữ chúng. Ví dụ: sử dụng mã như thế này:

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

Điều này sẽ xuất ra System.out phiên bản thoát đúng cách.

Trong trường hợp của tôi, đầu ra là:

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

Như bạn có thể thấy, đây là một cách dễ dàng để tạo nội dung của các tệp .properties được đảm bảo là chính xác. Và bạn có thể đặt bao nhiêu thuộc tính tùy thích.


6

Trong trường hợp của tôi, hai '\\' đứng đầu phù hợp với tôi.

Ví dụ: nếu từ của bạn chứa ký tự '#' (ví dụ: aa # 100, bạn có thể thoát khỏi nó bằng hai ký tự '\\' đứng đầu

   key= aa\\#100


Tôi thứ hai rằng, bạn cần hai dấu gạch chéo ngược (glassfish 4.1, bản dựng 13)
Susanta


2

Trong tệp khởi động Spring hoặc Spring application.properties đây là cách để thoát các ký tự đặc biệt;

table.whereclause = where id '\ =' 100


0

Phương pháp này sẽ giúp tạo lập trình các giá trị được đảm bảo tương thích 100% với .propertiescác tệp:

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);
    }
}

Bạn có thể gọi nó như thế này:

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

Phương pháp này hơi tốn kém một chút nhưng dù sao thì việc ghi các thuộc tính vào một tệp thường là một thao tác lẻ tẻ.


-1

Tôi đã có thể nhập các giá trị trong ký tự ":

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

Tại sao lại từ chối? Đó là một câu trả lời thật :)
russellhoff

Op cho biết các thuộc tính Java, dấu ngoặc kép không hoạt động như vậy trong các tệp thuộc tính java.
teknopaul
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.