2013-07-26 80 views
8

Tôi biết rằng tôi có thể tạo Bản đồ như bên dưới.Lưu trữ bản đồ trong các tệp thuộc tính

private static final ImmutableMap<String,String> WordMap = 
ImmutableMap.<String, String>builder() 
.put("blah", "blahblah").put("blabla", "blahblahblah").build() 

Tôi muốn lưu trữ các giá trị của bản đồ trong tệp cấu hình. Tôi đã lưu trữ các giá trị cho một HashSet khác nhau trong tập tin cấu hình bằng cách làm values=value1,value2,value3 và sau đó
new HashSet<String>(Arrays.asList(prop.getProperty(values).split(",")))

Tôi muốn làm điều gì đó tương tự cho bản đồ của tôi. Bất kỳ mẹo nào? Tôi đang sử dụng java.util.Properties

+0

Tôi đoán bạn không muốn thêm bản đồ bằng cách đặt mỗi cặp khóa/giá trị từ bản đồ của bạn trong 'Thuộc tính' (thông qua' properties.putAll (WordMap) ') - thay vào đó bạn cố gắng đặt toàn bộ bản đồ dưới dạng giá trị duy nhất vào các thuộc tính? – zapl

Trả lời

17

Kể từ khi bạn đã chỉ ra bạn không muốn sử dụng JSON, bạn có thể lưu trữ bản đồ dưới dạng tài sản duy nhất như thế này:

map=key1=value1,key2=value2,key3=value3 

Sử dụng Guava's Splitter and Joiner để đơn giản hóa việc đọc và viết các bản đồ:

String formatMap(Map<String, String> map) { 
    return Joiner.on(",").withKeyValueSeparator("=").join(map); 
} 

Map<String, String> parseMap(String formattedMap) { 
    return Splitter.on(",").withKeyValueSeparator("=").split(formattedMap); 
} 

Điều này sẽ hoạt động miễn là các khóa và giá trị không chứa ký tự "," hoặc "=".

+0

cảm ơn! vì vậy tôi chỉ có thể có được tài sản, gọi parseMap và thiết lập nó bằng bản đồ của tôi – Lemonio

+0

sẽ có một cách hiệu quả để làm các tuyên bố thứ hai với một thứ tự ngược lại? nếu tôi muốn một giá trị -> bản đồ chính là tốt và không muốn đi qua toàn bộ điều và tạo lại một cái mới hoặc lưu trữ một cấu hình thứ hai trong tập tin thuộc tính – Lemonio

+0

@Lemonio nhìn vào Biava của Biava: http: // docs. guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/BiMap.html – dnault

1

java.util.Properties sử dụng nội bộ để có thể lưu trữ các cặp khóa giá trị được đề cập trong tệp thuộc tính. Bạn có thể tận dụng nó cho mục đích của bạn.

+0

@SotiriosDelimanolis yeah đã sửa. Cảm ơn! –

+0

Bạn có thể cũng muốn thay đổi rằng nó không _use nội bộ_. Tôi hiểu rằng vì nó có một biến cá thể. Nó thực sự 'mở rộng Hashtable'. Nó có thể gây nhầm lẫn cho người khác. –

+0

@ Zim-ZamO'Pootertoot công khai Thuộc tính lớp mở rộng Hashtable

2

Định dạng nội dung của Bản đồ dưới dạng Chuỗi. Sử dụng định dạng chuẩn như JSON. Với thư viện json-smart này sẽ giống như thế:

JSONObject json = new JSONObject(); 
json.putAll(WordMap); 
String serializedMap = json.toString(); 
prop.setProperty("wordMap", serializedMap); 

Để phân tích bản đồ:

String serializedMap = prop.getProperty("wordMap"); 
JSONObject json = (JSONObject) JSONValue.parse(serializedMap); 
Map<String, String> wordMap = new HashMap<>(); 

for (Map.Entry<String,Object> entry : json.entrySet()) { 
    wordMap.put(entry.getKey(), (String) entry.getValue()); 
} 
+0

Được rồi, cảm ơn! bản đồ có phải được tạo bằng mã đó không? thuộc tính nhiều hơn chỉ là một tập tin văn bản? bởi vì ý tưởng là mọi người sẽ có thể cấu hình nội dung của bản đồ bên trong tệp văn bản, nếu họ cần chạy mã để làm điều đó thì không có điểm nào trong việc bao gồm nó vì họ cũng có thể thay đổi câu lệnh đặt trong mã – Lemonio

+1

Ý tưởng đằng sau câu trả lời này là nếu bạn muốn lưu trữ bản đồ từ trong một thuộc tính duy nhất, bạn sẽ cần định dạng nó thành một chuỗi. JSON là một định dạng chuẩn với hỗ trợ thư viện tốt, nhưng vì bạn định cho người dùng cuối chỉnh sửa tệp thuộc tính JSON có lẽ không phải là lựa chọn tốt nhất. Chỉ cần sử dụng bất kỳ định dạng nào bạn nghĩ sẽ đơn giản nhất cho người dùng của mình và viết mã tùy chỉnh để định dạng và phân tích cú pháp. map = key1 = value1, key2 = value2, key3 = value4 sẽ hoạt động tốt, miễn là khóa và giá trị của bạn không bao giờ chứa ký tự "=" hoặc ",". – dnault

+0

Sau khi đăng câu trả lời này, Jackson đã trở thành thư viện của tôi được lựa chọn cho JSON [de] serialization và ràng buộc dữ liệu. – dnault