java - tutorial - maven شرح




كيف أقوم بتحميل ملف من مجلد الموارد؟ (8)

أحصل عليه للعمل دون أي إشارة إلى "الطبقة" أو "ClassLoader".

لنفترض أن لدينا ثلاثة سيناريوهات مع موقع الملف 'example.file' ودليل عملك (حيث ينفذ تطبيقك) هو home / mydocuments / program / projects / myapp:

أ) سليل مجلد فرعي إلى دليل العمل: myapp / res / files / example.file

ب) مجلد فرعي لا ينحدر إلى دليل العمل: المشاريع / الملفات / example.file

b2) مجلد فرعي آخر لا ينحدر إلى دليل العمل: program / files / example.file

ج) مجلد الجذر: home / mydocuments / files / example.file (Linux ، في Windows استبدل home / with C :)

1) الحصول على المسار الصحيح: أ) String path = "res/files/example.file"; b) String path = "../projects/files/example.file" b2) String path = "../../program/files/example.file" c) String path = "/home/mydocuments/files/example.file"

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

2) إنشاء كائن ملف عن طريق تمرير المسار الصحيح:

File file = new File(path);

3) أنت الآن على ما يرام:

BufferedReader br = new BufferedReader(new FileReader(file));

يحتوي مشروعي على البنية التالية:

/src/main/java/
/src/main/resources/
/src/test/java/
/src/test/resources/

لدي ملف في /src/test/resources/test.csv وأريد تحميل الملف من اختبار وحدة في /src/test/java/MyTest.java

لدي هذا الرمز الذي لم ينجح. يشتكي "لا يوجد ملف أو دليل".

BufferedReader br = new BufferedReader (new FileReader(test.csv))

أنا أيضا حاولت هذا

InputStream is = (InputStream) MyTest.class.getResourcesAsStream(test.csv))

هذا أيضا لا يعمل. تقوم بإرجاع null . أنا أستخدم مافن لبناء مشروعي.


الآن أقوم بتوضيح الكود المصدري لقراءة خط من دليل الموارد الذي أنشأه maven ،

قرار مجلس الأمن / الرئيسية / موارد / calibril.ttf

Font getCalibriLightFont(int fontSize){
    Font font = null;
    try{
        URL fontURL = OneMethod.class.getResource("/calibril.ttf");
        InputStream fontStream = fontURL.openStream();
        font = new Font(Font.createFont(Font.TRUETYPE_FONT, fontStream).getFamily(), Font.PLAIN, fontSize);
        fontStream.close();
    }catch(IOException | FontFormatException ief){
        font = new Font("Arial", Font.PLAIN, fontSize);
        ief.printStackTrace();
    }   
    return font;
}

عملت بالنسبة لي ، ونأمل أن رمز المصدر بأكمله سيساعدك أيضا ، استمتع!


جرِّب رموز التدفق في مشروع الربيع

ClassPathResource resource = new ClassPathResource("fileName");
InputStream inputStream = resource.getInputStream();

أو على مشروع غير الربيع

 ClassLoader classLoader = getClass().getClassLoader();
 File file = new File(classLoader.getResource("fileName").getFile());
 InputStream inputStream = new FileInputStream(file);

كان getResource () يعمل بشكل جيد مع ملفات الموارد الموضوعة في src/main/resources فقط. للحصول على ملف موجود في المسار غير src/main/resources يقول src/test/java تحتاج إلى إنشائه بشكلٍ صريح.

المثال التالي قد يساعدك

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;

public class Main {
    public static void main(String[] args) throws URISyntaxException, IOException {
        URL location = Main.class.getProtectionDomain().getCodeSource().getLocation();
        BufferedReader br = new BufferedReader(new FileReader(location.getPath().toString().replace("/target/classes/", "/src/test/java/youfilename.txt")));
    }
}

محاولة:

InputStream is = MyTest.class.getResourceAsStream("/test.csv");

IIRC getResourceAsStream() بشكل افتراضي نسبة إلى حزمة الفئة.


هل يعمل الرمز عند عدم تشغيل جرة Maven-build ، على سبيل المثال عند التشغيل من IDE؟ إذا كان الأمر كذلك ، فتأكد من تضمين الملف بالفعل في الجرة. يجب تضمين مجلد الموارد في ملف pom ، في <build><resources> .


يمكن استخدام الفئة التالية لتحميل resource من classpath كما تتلقى رسالة خطأ ملائمة في حالة وجود مشكلة في filePath المحدد.

import java.io.InputStream;
import java.nio.file.NoSuchFileException;

public class ResourceLoader
{
    private String filePath;

    public ResourceLoader(String filePath)
    {
        this.filePath = filePath;

        if(filePath.startsWith("/"))
        {
            throw new IllegalArgumentException("Relative paths may not have a leading slash!");
        }
    }

    public InputStream getResource() throws NoSuchFileException
    {
        ClassLoader classLoader = this.getClass().getClassLoader();

        InputStream inputStream = classLoader.getResourceAsStream(filePath);

        if(inputStream == null)
        {
            throw new NoSuchFileException("Resource file not found. Note that the current directory is the source folder!");
        }

        return inputStream;
    }
}

ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream is = loader.getResourceAsStream("test.csv");

إذا كنت تستخدم ClassLoader السياق للعثور على مورد ، فمن المؤكد أنه سيكلف أداء التطبيق.





maven