2012-05-22 32 views
15

Tôi đang sử dụng tệp thuộc tính để lưu trữ các giá trị cấu hình của ứng dụng. Trong một trong các trường hợp, tôi phải lưu trữ một giá trị là xxx:yyy:zzz. Khi tôi làm điều đó, dấu hai chấm được thoát bằng dấu gạch chéo \ dẫn đến giá trị hiển thị là xxx\:yyy\:zzz trong tệp thuộc tính.Làm cách nào để thoát khỏi dấu hai chấm (:) trong tệp Thuộc tính?

Tôi biết rằng dấu hai chấm : là dấu phân cách chuẩn của lớp Java Properties. Tuy nhiên tôi vẫn cần lưu giá trị mà không có dấu gạch chéo ngược \.

Bất kỳ đề xuất nào về cách xử lý việc này?

+1

Tôi sợ bạn không thể.Nếu không, làm thế nào có thể các tập tin thuộc tính được đọc lại mà không gây nhầm lẫn "của bạn" dấu hai chấm, và dấu hai chấm sử dụng để phân định các giá trị quan trọng? – ewernli

+0

Tạo một StringWriter, ghi tập tin thuộc tính của bạn vào nó, đi qua bộ đệm từng dòng tìm kiếm '" \: "', và thay thế nó bằng một '": "' duy nhất. Đây không phải là đẹp, nhưng sau đó một lần nữa những gì bạn đang cố gắng làm cũng không phải là rất đẹp. – dasblinkenlight

+1

@BhavikAmbani 'Sử dụng cụm từ thông dụng' cho điều đó * làm cách nào? * Ở đâu chính xác bạn có cơ hội chỉ định biểu thức chính quy khi lưu tệp thuộc tính và RE chính xác như thế nào? – EJP

Trả lời

16

Đặt các thuộc tính vào đối tượng Properties và lưu nó bằng phương thức store(...). Phương pháp sẽ thực hiện bất kỳ yêu cầu thoát nào. Các Java documentation nói:.

" ... Đối với chìa khóa, tất cả các nhân vật không gian được viết với một ký tự \ trước Đối với nguyên tố này, các nhân vật không gian hàng đầu, nhưng không được nhúng hoặc trailing ký tự không gian, được viết với một ký tự khóa và phần tử #,!, = và: được viết bằng dấu gạch chéo ngược trước để đảm bảo rằng chúng được tải đúng cách. "

Bạn chỉ cần tự thoát các ký tự nếu bạn đang tạo/ghi tệp bằng tay.


Ngược lại, nếu bạn muốn tệp chứa các ký tự đại tràng không thoát, bạn sẽ không may mắn. Tệp như vậy không đúng định dạng và có thể không tải đúng cách bằng các phương thức Properties.load(...). Nếu bạn đi xuống tuyến đường này, bạn sẽ cần triển khai các phương pháp lưu trữ và/hoặc lưu trữ tùy chỉnh của riêng mình.

1

Nếu bạn sử dụng biến thể xml của tệp thuộc tính (sử dụng loadFromXMLstoreToXML) thì đây không phải là vấn đề.

+0

Tôi thích cách tiếp cận này, nhưng định dạng XML khó đọc hơn cho noobs ("khách hàng vv") ... Tôi nghĩ nên có cách thoát: hoặc sử dụng một số utils để chọn dấu phân cách giá trị chính, bây giờ: được lấy làm dấu phân cách quá ... –

2

Chúng tôi đã nhấn câu hỏi này vài ngày trước. Chúng tôi đã thao tác các tệp thuộc tính hiện có với URL dưới dạng giá trị.

Đó là rủi ro nhưng nếu giá trị tài sản của bạn là ít hơn 40 ký tự sau đó bạn có thể sử dụng "danh sách" phương pháp thay vì "cửa hàng":

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

Chúng tôi đã có một cái nhìn nhanh chóng vào mã JDK và đã tấn công triển khai cửa hàng tùy chỉnh hoạt động cho mục đích của chúng tôi:

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

Tôi gặp phải vấn đề tương tự. Chuyển tiếp dấu gạch chéo / cũng được thoát bằng phương pháp store() trong Properties.

Tôi đã giải quyết vấn đề này bằng cách tạo lớp CustomProperties của riêng mình (mở rộng java.util.Properties) và nhận xét cuộc gọi đến saveConvert() theo phương thức customStore0().

Đây là lớp CustomProperties tôi:

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(); 
    } 
} 
Các vấn đề liên quan