هل من الممكن تضمين ملفات حزمة الموارد داخل حزمة موارد
-
26-09-2019 - |
سؤال
نحن نستخدم java.util.ResourceBundle
لتحميل معلومات الممتلكات. نمت ملف العقار الخاص بنا بشكل كبير ونفكر في تقسيم ملف الخصائص الرئيسية إلى عدة وحدات فرعية. هل من الممكن تحقيق ذلك؟
master.properties
==>
master.properties
include moduleA.properties
include moduleB.properties
دعني اعرف؟
المحلول
بادئ ذي بدء ، أتساءل لماذا اخترت java.util.ResourceBundle
على java.util.Properties
. بالنظر إلى كيفية صياغة سؤالك ، لا يبدو أنك تهتم بالتوطين/التدويل ولا حول ميراث ملف حزمة.
مع Properties
إنه أمر سهل للغاية لأنه ينفذ Map
الذي بدوره يقدم putAll()
طريقة لدمج خريطة أخرى. مثال انطلاق:
Properties master = new Properties();
master.load(masterInput);
Properties moduleA = new Properties();
moduleA.load(moduleAinput);
master.putAll(moduleA);
Properties moduleB = new Properties();
moduleB.load(moduleBinput);
master.putAll(moduleB);
// Now `master` contains the properties of all files.
إذا كنت تصر حقًا على استخدام ResourceBundle
, ، أفضل رهان لك هو إنشاء مخصص ResourceBundle
حيث تقوم بالتحميل بفضل العرف Control
.
على افتراض أنك في الإدخال التالي في master.properties
الذي يمثل سلسلة مفصلية مع أسماء أساسية لملفات خصائص الوحدة النمطية:
include=moduleA,moduleB
ثم العرف التالي ResourceBundle
يجب أن يعمل مثال:
public class MultiResourceBundle extends ResourceBundle {
protected static final Control CONTROL = new MultiResourceBundleControl();
private Properties properties;
public MultiResourceBundle(String baseName) {
setParent(ResourceBundle.getBundle(baseName, CONTROL));
}
protected MultiResourceBundle(Properties properties) {
this.properties = properties;
}
@Override
protected Object handleGetObject(String key) {
return properties != null ? properties.get(key) : parent.getObject(key);
}
@Override
@SuppressWarnings("unchecked")
public Enumeration<String> getKeys() {
return properties != null ? (Enumeration<String>) properties.propertyNames() : parent.getKeys();
}
protected static class MultiResourceBundleControl extends Control {
@Override
public ResourceBundle newBundle(
String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException
{
Properties properties = load(baseName, loader);
String include = properties.getProperty("include");
if (include != null) {
for (String includeBaseName : include.split("\\s*,\\s*")) {
properties.putAll(load(includeBaseName, loader));
}
}
return new MultiResourceBundle(properties);
}
private Properties load(String baseName, ClassLoader loader) throws IOException {
Properties properties = new Properties();
properties.load(loader.getResourceAsStream(baseName + ".properties"));
return properties;
}
}
}
(يتم ترك معالجة الاستثناءات التافهة ومعالجة التوطين جانباً ، الأمر متروك لك)
يمكن استخدام هذا على النحو التالي:
ResourceBundle bundle = new MultiResourceBundle("master");
نصائح أخرى
ومع ذلك ، يمكنك بناء ResourceBundle ، ولكن كما تقول ، فإن ملفك ضخم ، فماذا لو تم تحميله في الذاكرة.
تحديث
public class Resource extends java.util.ResourceBundle {
public Object handleGetObject(String key) {
//code
}
public Enumeration getKeys() {
//code
}
}
ثم في اللغة
import java.util.*;
public class Resource_en_IN extends Resource{
public Object handleGetObject(String key) {
//code
}
}
المزيد من الطعام للتفكير من الحل الذي تم اختباره.
دعم ملفات XML جهات لمضمنة النص من ملفات أخرى أثناء التحليل. إذا شوهدت ملفات XML معقدة ، حيث تم استخدام هذه التقنية لتعديل الملفات.
Properties
يدعم الآن تنسيقين للملفات ، الشائع .properties
تنسيق مع أزواج المفتاح/القيمة وتنسيقات XML. Properties
يمكن تحميل وتخزين/من ملفات XML.
ResourceBundle
لديه فئة فرعية مباشرة: PropertyResourceBundle
. يبدو أن هذه الفئة تقتصر في الواقع على تنسيق زوج المفتاح/القيمة الأقدم ، ولكن يمكن استخدامه لتنفيذ فئة أخرى ، مثل XMLPropertyResourceBundle
وهو قادر على قراءة خصائص من ملفات XML حيث entity
يمكن أن تساعد الخدعة في تعديل تلك الملفات.
إذا كان هذا يعمل - يجب أن يكون تحويل ملفات الخصائص الموجودة إلى ملفات خصائص XML أمرًا سهلاً ، فقط استخدم Properties
فئة ، اقرأ من التنسيق القياسي وتخزينها إلى XML.