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:
Hơn nữa, hãy tham khảo phương thức tải (Trình đọc Reader) từ Property
lớ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
và\n
thoá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.
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ị.
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.
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.
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
Bạn có thể xem ở đây Khóa trong thuộc tính Java có thể bao gồm một ký tự trống không?
để thoát bằng '=' \ u003d
table.whereclause = where id = 100
key: [table.whereclause] value: [where id = 100]
table.whereclause \ u003dwhere id = 100
khóa: [table.whereclause = where] value: [id = 100]
table.whereclause \ u003dwhere \ u0020id \ u003d100
key: [table.whereclause = where id = 100] value: []
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 .properties
cá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ẻ.
Tôi đã có thể nhập các giá trị trong ký tự ":
db_user="postgresql"
db_passwd="this,is,my,password"