উত্তর:
আপনি যা চান সমাধান অনুসারে কাজ করুন ...
ক্লাস থেকে দুটি জিনিস পাওয়া যাবে getResource
/ getResourceAsStream()
যাতে বলা হয় ...
সুতরাং আপনি যদি
this.getClass().getResource("foo.txt");
এটি "এই" শ্রেণীর হিসাবে একই প্যাকেজ থেকে এবং "এই" শ্রেণীর শ্রেণি লোডার সহ foo.txt লোড করার চেষ্টা করবে। যদি আপনি "/" সামনে রাখেন তবে আপনি সম্পদটি একেবারে উল্লেখ করছেন।
this.getClass().getResource("/x/y/z/foo.txt")
"এটি" এর ক্লাস লোডার এবং xyz প্যাকেজ থেকে রিসোর্স লোড করবে (এটি প্যাকেজের ক্লাসগুলির মতো একই ডিরেক্টরিতে থাকা প্রয়োজন)।
Thread.currentThread().getContextClassLoader().getResource(name)
প্রসঙ্গ শ্রেণীর লোডার দিয়ে লোড করবে তবে কোনও প্যাকেজ অনুযায়ী নামটি সমাধান করবে না (এটি অবশ্যই একেবারে উল্লেখ করা উচিত)
System.class.getResource(name)
সিস্টেম বর্গ লোডার দিয়ে রিসোর্স লোড করবে (এটি একেবারে উল্লেখযোগ্যভাবে হবে, কারণ আপনি java.lang প্যাকেজটিতে (সিস্টেমের প্যাকেজ) কোনও কিছুই রাখতে পারবেন না।
উত্সটি একবার দেখুন। এছাড়াও ইঙ্গিত করে যে getResourceAsStream ইউটিউলে getResource থেকে ফিরে কেবল "ওপেনস্ট্রিম" কল করে এবং এটি ফেরত দেয়।
Thread#setContextClassLoader
। প্রোগ্রামটি সঞ্চালনের সময় আপনার ক্লাসপথটি সংশোধন করতে হবে তবে এটি কার্যকর।
ঠিক আছে, এটি আংশিকভাবে নির্ভর করে যদি আপনি আসলে একটি উদ্ভূত শ্রেণিতে থাকেন তবে আপনি কী হতে চান ।
উদাহরণস্বরূপ, ধরুন SuperClass
এজারে এবং SubClass
বিজারে রয়েছে এবং আপনি ঘোষিত একটি উদাহরণ পদ্ধতিতে কোড সম্পাদন করছেন SuperClass
তবে যেখানে this
উদাহরণটির উল্লেখ রয়েছে SubClass
। আপনি যদি this.getClass().getResource()
এটি ব্যবহার করেন তবে এটি SubClass
বিজারের সাথে সম্পর্কিত হবে। আমার সন্দেহ হয় যা সাধারণত প্রয়োজন হয় না।
ব্যক্তিগতভাবে আমি সম্ভবত Foo.class.getResourceAsStream(name)
প্রায়শই ব্যবহার করতাম - যদি আপনি ইতিমধ্যে নিজের যে সংস্থানটি পরেছেন তার নামটি যদি আপনি জানতে থাকেন এবং এটি কোথায় সম্পর্কিত তবে আপনি অবশ্যই নিশ্চিত হন Foo
যে এটি আইএমও করার সবচেয়ে শক্তিশালী উপায়।
অবশ্যই এমন সময় রয়েছে যখন আপনি যা চান তাও নয় : প্রতিটি মামলার গুণাবলী বিবেচনা করুন। এটি কেবলমাত্র "আমি জানি এই সংস্থানটি এই শ্রেণীর সাথে একত্রিত করা হয়েছে" এটি সর্বাধিক সাধারণ যা আমি প্রবেশ করেছি।
this.getClass()
। সাবক্লাসের একটি উদাহরণ তৈরি করুন এবং পদ্ধতিটি কল করুন ... এটি সাবক্লাসের নাম মুদ্রণ করবে, সুপারক্লাস নয়।
আমি নীচে প্রদর্শিত হিসাবে তিনটি জায়গা অনুসন্ধান। মন্তব্য স্বাগত।
public URL getResource(String resource){
URL url ;
//Try with the Thread Context Loader.
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
if(classLoader != null){
url = classLoader.getResource(resource);
if(url != null){
return url;
}
}
//Let's now try with the classloader that loaded this class.
classLoader = Loader.class.getClassLoader();
if(classLoader != null){
url = classLoader.getResource(resource);
if(url != null){
return url;
}
}
//Last ditch attempt. Get the resource from the classpath.
return ClassLoader.getSystemResource(resource);
}
আমি জানি অন্য উত্তরের জন্য এটি খুব দেরি হয়ে গেছে তবে শেষের দিকে আমাকে কী সাহায্য করেছে তা আমি কেবল ভাগ করে নিতে চাই। এটি ফাইল সিস্টেমের পরম পথ থেকে কেবল সংস্থান / ফাইলগুলি লোড করবে (কেবল শ্রেণিপথ নয়)।
public class ResourceLoader {
public static URL getResource(String resource) {
final List<ClassLoader> classLoaders = new ArrayList<ClassLoader>();
classLoaders.add(Thread.currentThread().getContextClassLoader());
classLoaders.add(ResourceLoader.class.getClassLoader());
for (ClassLoader classLoader : classLoaders) {
final URL url = getResourceWith(classLoader, resource);
if (url != null) {
return url;
}
}
final URL systemResource = ClassLoader.getSystemResource(resource);
if (systemResource != null) {
return systemResource;
} else {
try {
return new File(resource).toURI().toURL();
} catch (MalformedURLException e) {
return null;
}
}
}
private static URL getResourceWith(ClassLoader classLoader, String resource) {
if (classLoader != null) {
return classLoader.getResource(resource);
}
return null;
}
}
আমি উপরে প্রস্তাবিত প্রচুর উপায় এবং ফাংশন চেষ্টা করেছি, কিন্তু তারা আমার প্রকল্পে কাজ করেনি। যাইহোক আমি সমাধান খুঁজে পেয়েছি এবং এটি এখানে:
try {
InputStream path = this.getClass().getClassLoader().getResourceAsStream("img/left-hand.png");
img = ImageIO.read(path);
} catch (IOException e) {
e.printStackTrace();
}
this.getClass().getResourceAsStream()
এই ক্ষেত্রে আপনার আরও ভাল ব্যবহার করা উচিত । আপনি যদি getResourceAsStream
পদ্ধতির উত্সটি দেখে থাকেন তবে লক্ষ্য করবেন যে এটি আপনার চেয়ে একই কাজ করে তবে একটি স্মার্ট পদ্ধতিতে ( ClassLoader
ক্লাসে যদি খুঁজে পাওয়া যায় না তবে ফলব্যাক )। এছাড়া ইঙ্গিত করছে যে একটি সম্ভাব্য সম্মুখীন করতে null
উপর getClassLoader
আপনার কোডে ...
this.getClass().getResourceAsStream()
আমার পক্ষে কাজ করে না, তাই আমি সেই কাজগুলি ব্যবহার করি। আমি মনে করি এমন কিছু লোক আছেন যারা আমার মতো সমস্যার মুখোমুখি হতে পারেন।