سؤال

أحتاج في تطبيق Java الخاص بي إلى الحصول على بعض الملفات والأدلة.

وهذا هو هيكل البرنامج:

./main.java
./package1/guiclass.java
./package1/resources/resourcesloader.java
./package1/resources/repository/modules/   -> this is the dir I need to get
./package1/resources/repository/SSL-Key/cert.jks    -> this is the file I need to get

guiclass يقوم بتحميل فئة Resourcesloader التي ستقوم بتحميل الموارد الخاصة بي (الدليل والملف).

أما بالنسبة للملف فأنا حاولت

resourcesloader.class.getClass().getResource("repository/SSL-Key/cert.jks").toString()

من أجل الحصول على المسار الحقيقي، ولكن هذا الطريق لا يعمل.

ليس لدي أي فكرة عن كيفية القيام بالدليل.

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

المحلول

تزويد المسار بالنسبة إلى Classlader، وليس الفصل الذي تحصل عليه. على سبيل المثال:

resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString();

نصائح أخرى

كان لدي مشاكل في استخدام getClass().getResource("filename.txt") طريقة. عند قراءة تعليمات Java Docs، إذا لم يكن موردك في نفس الحزمة مثل الفصل الذي تحاول الوصول إليه من المورد، فعليك إعطائه المسار النسبي الذي يبدأ به '/'. وبعد تتمثل الإستراتيجية الموصى بها في وضع ملفات الموارد الخاصة بك ضمن مجلد "موارد" في الدليل الجذر. لذلك على سبيل المثال إذا كان لديك الهيكل:

src/main/com/mycompany/myapp

ثم يمكنك إضافة مجلد موارد على النحو الموصى به بواسطة Maven in:

src/main/resources

علاوة على ذلك، يمكنك إضافة مجلدات فرعية في مجلد الموارد

src/main/resources/textfiles

وقل أن ملفك يسمى myfile.txt لذلك لديك

src/main/resources/textfiles/myfile.txt

الآن هنا حيث تأتي مشكلة المسار الغبي. قل لديك فئة في حياتك com.mycompany.myapp package, ، وتريد الوصول إلى myfile.txt ملف من مجلد الموارد الخاص بك. يقول البعض أنك بحاجة إلى إعطاء:

"/main/resources/textfiles/myfile.txt" path

أو

"/resources/textfiles/myfile.txt"

كل من هذه مخطئ. بعد أن ران mvn clean compile, ، يتم نسخ الملفات والمجلدات في:

myapp/target/classes 

مجلد. لكن مجلد الموارد ليس هناك، فقط المجلدات في مجلد الموارد. لذلك لديك:

myapp/target/classes/textfiles/myfile.txt

myapp/target/classes/com/mycompany/myapp/*

لذلك المسار الصحيح لإعطاء getClass().getResource("") الطريقة هي:

"/textfiles/myfile.txt"

ها هو:

getClass().getResource("/textfiles/myfile.txt")

لن يؤدي هذا إلى إرجاع NULL، ولكن سيعود فصلك. امل ان يساعد هذا احد ما. من الغريب بالنسبة لي، أن "resources" لم يتم نسخ المجلد أيضا، ولكن فقط المجلدات الفرعية والملفات مباشرة في "resources" مجلد. يبدو من المنطقي بالنسبة لي أن "resources" سيتم العثور على مجلد أيضا تحت "myapp/target/classes"

على أمل توفير معلومات إضافية لأولئك الذين لا يختارون هذا الأمر بأسرع وقت ممكن، أود تقديم سيناريو لأنه يحتوي على إعداد مختلف قليلا. تم إعداد مشروعي مع هيكل الدليل التالي (باستخدام Eclipse):

المشروع / SRC / /// تطبيق شفرة المصدر ORG / MyProject / MyClass.java الاختبارات / / اختبارات وحدة RES / / صور الموارد / // PNG صور للأيقونات My-Image.png XML / //// XSD لملفات التحقق من صحة ملفات XML مع Jaxb My-Schema.xsd Conf / // الافتراضي ملف .conf ل log4j log4j.conf lib / / //////ysaries المضافة إلى مسار البناء عبر إعدادات المشروع

كنت أواجه مشكلات تحميل مواردي من رجع الدليل. أردت أن تفصل كل مواردي عن شفرة المصدر الخاصة بي (ببساطة لأغراض الإدارة / المنظمة). لذلك، ما كان علي فعله هو إضافة رجع دليل إلى مسار بناء ثم الوصول إلى المورد عبر:

static final ClassLoader loader = MyClass.class.getClassLoader();

// in some function
loader.getResource("images/my-image.png");
loader.getResource("xml/my-schema.xsd");
loader.getResource("conf/log4j.conf");

ملاحظة: ال / تم حذفها من بداية سلسلة الموارد لأنني أستخدم Classloader.getResource (سلسلة) بدلا من Class.getResource (سلسلة).

giancarlo: يمكنك محاولة استدعاء مستخدم خاصية النظام. من شأنها أن تعطيك جذر مشروع Java الخاص بك ثم قم بإلحاق هذا المسار على المسار النسبي الخاص بك على سبيل المثال:

String root = System.getProperty("user.dir");
String filepath = "/path/to/yourfile.txt"; // in case of Windows: "\\path \\to\\yourfile.txt
String abspath = root+filepath;



// using above path read your file into byte []
File file = new File(abspath);
FileInputStream fis = new FileInputStream(file);
byte []filebytes = new byte[(int)file.length()];
fis.read(filebytes);

عند استخدام "getResource" في فئة ما، يتم حل المسار النسبي بناءً على الحزمة الموجودة في الفئة.عند استخدام "getResource" على ClassLoader، يتم حل المسار النسبي بناءً على المجلد الجذر.

إذا كنت تستخدم مسارًا مطلقًا، فستبدأ كلتا الطريقتين "getResource" في المجلد الجذر.

لأولئك الذين يستخدمون Eclipse + Maven. قل أنك تحاول الوصول إلى الملف images/pic.jpg في src/main/resources. وبعد القيام بذلك بهذه الطريقة:

ClassLoader loader = MyClass.class.getClassLoader();
File file = new File(loader.getResource("images/pic.jpg").getFile());

صحيح تماما، ولكن قد يؤدي إلى استثناء مؤشر فارغ. يبدو أن Eclipse لا يتعرف على المجلدات في بنية Directory MaVen كجلدات مصدر على الفور. عن طريق إزالة و src/main/resources مجلد من قائمة مجلدات مصدر المشروع ووضعه مرة أخرى (المشروع> خصائص> مسار بناء Java> المصدر> إزالة / إضافة مجلد)، كنت قادرا على حل هذا.

resourcesloader.class.getClass()

يمكن تقسيمها إلى:

Class<resourcesloader> clazz = resourceloader.class;
Class<Class> classClass = clazz.getClass();

مما يعني أنك تحاول تحميل المورد باستخدام فئة Bootstrap.

بدلا من ذلك، ربما تريد شيئا مثل:

resourcesloader.class.getResource("repository/SSL-Key/cert.jks").toString()

إذا حذر Javac فقط من الاتصال بالطرق الثابتة على السياقات غير الثابتة ...

ظبية العمل التالي؟

resourcesloader.class.getClass().getResource("/package1/resources/repository/SSL-Key/cert.jks")

هل هناك سبب لا يمكنك تحديد المسار الكامل بما في ذلك الحزمة؟

الذهاب مع إجابتين كما هو مذكور أعلاه. الاول

resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString();
resourcesloader.class.getResource("repository/SSL-Key/cert.jks").toString()

يجب أن تكون واحدة ونفس الشيء؟

لقد قمت بتعديل صغير على بطانة @ jonathan.cone واحد (عن طريق إضافة .getFile() ) لتجنب استثناء مؤشر NULL، وإعداد المسار إلى دليل البيانات. إليك ما نجح لي:

String realmID = new java.util.Scanner(new java.io.File(RandomDataGenerator.class.getClassLoader().getResource("data/aa-qa-id.csv").getFile().toString())).next();

استخدم هذا:

resourcesloader.class.getClassLoader().getResource("/path/to/file").**getPath();**

من أجل الحصول على طريق حقيقي إلى الملف، يمكنك تجربة هذا:

URL fileUrl = Resourceloader.class.getResource("resources/repository/SSL-Key/cert.jks");
String pathToClass = fileUrl.getPath;    

Resourceloader هو اسم classname هنا. "الموارد / المستودع / مفتاح SSL / CERT.JKS" هو المسار النسبي إلى الملف. إذا كان لديك Guiclass الخاص بك في ./package1/java مع بقية هيكل المجلد المتبقي، سوف تأخذ "../resources/repository/ssl-key/cert.jks" كمسار نسبي بسبب القواعد التي تحدد المسار النسبي.

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

BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(fileUrl.openStream()));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top