سؤال

هل هناك طريقة في جاوة لبناء مثيل الملف على مورد استردادها من جرة من خلال classloader؟

ويستخدم طلبي بعض الملفات من جرة (الافتراضي) أو من دليل الملفات المحددة في وقت التشغيل (مدخلات المستخدم). أنا أبحث عن وسيلة متسقة من
أ) تحميل هذه الملفات وتيار و
ب) سرد الملفات في الدليل المعرفة من قبل المستخدم أو دليل في الجرة على التوالي

وتحرير: على ما يبدو، فإن النهج المثالي هو أن يكون على البقاء بعيدا عن java.io.File تماما. هل هناك طريقة لتحميل الدليل من CLASSPATH وقائمة محتوياته (ملفات / الكيانات الواردة فيه)؟

هل كانت مفيدة؟

المحلول

وClassLoader.getResourceAsStream وClass.getResourceAsStream هي بالتأكيد وسيلة للذهاب لتحميل بيانات الموارد. ومع ذلك، لا أعتقد أن هناك أي وسيلة ل"إدراج" محتويات عنصر من CLASSPATH.

في بعض الحالات قد يكون هذا ببساطة مستحيل - على سبيل المثال، وهو ClassLoader <م> قد توليد البيانات على الطاير، على أساس ما اسم المورد انها طلبت. إذا نظرتم الى API ClassLoader (والذي هو أساسا ما تعمل آلية CLASSPATH خلال) سترى ليس هناك أي شيء لتفعل ما تريد.

إذا كنت أعلم أنك قد حصلت فعلا ملف جرة، هل يمكن تحميل هذا مع ZipInputStream لمعرفة ما هو متاح. فإن ذلك يعني سيكون لديك رمز مختلف عن الدلائل والملفات جرة بالرغم من ذلك.

وبديل واحد، إذا يتم إنشاء الملفات على حدة أولا، لتشمل نوعا من ملف البيان الذي يحتوي على قائمة من الموارد المتاحة. حزمة أنه في ملف جرة أو إدراجه في نظام الملفات كملف، وتحميله قبل أن يعرض للمستخدم اختيار الموارد.

نصائح أخرى

وكان لي نفس المشكلة وكان قادرا على استخدام ما يلي:

// Load the directory as a resource
URL dir_url = ClassLoader.getSystemResource(dir_path);
// Turn the resource into a File object
File dir = new File(dir_url.toURI());
// List the directory
String files = dir.list()

وهنا قليلا من التعليمات البرمجية من واحد من التطبيقات بلدي ... اسمحوا لي أن أعرف ما إذا كان يناسب احتياجاتك. يمكنك استخدام هذا إذا كنت تعرف الملف الذي تريد استخدامه.

URL defaultImage = ClassA.class.getResource("/packageA/subPackage/image-name.png");
File imageFile = new File(defaultImage.toURI());

وعلى أمل أن يساعد.

وهناك طريقة يمكن الاعتماد عليها لبناء مثيل الملف على مورد استردادها من جرة هو لنسخ المورد للتيار في ملف مؤقت (سيتم حذف ملف مؤقت عندما يخرج من JVM):

public static File getResourceAsFile(String resourcePath) {
    try {
        InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath);
        if (in == null) {
            return null;
        }

        File tempFile = File.createTempFile(String.valueOf(in.hashCode()), ".tmp");
        tempFile.deleteOnExit();

        try (FileOutputStream out = new FileOutputStream(tempFile)) {
            //copy stream
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
        }
        return tempFile;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

وجرب هذا:

ClassLoader.getResourceAsStream ("some/pkg/resource.properties");

وهناك المزيد من الطرق المتاحة، على سبيل المثال انظر هنا: http://www.javaworld.com/ و JavaWorld / javaqa / 2003-08 / 01-سؤال وجواب-0808-property.html

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