هل من الممكن تضمين ملفات حزمة الموارد داخل حزمة موارد

StackOverflow https://stackoverflow.com/questions/4614465

  •  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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top