আপনি যেভাবে fileName
পার করছেন তা কীভাবে ব্যাখ্যা করা যায় তা সম্পর্কে সূক্ষ্ম পার্থক্য রয়েছে। মূলত, আপনার কাছে দুটি পৃথক পদ্ধতি রয়েছে: ClassLoader.getResourceAsStream()
এবং Class.getResourceAsStream()
। এই দুটি পদ্ধতি রিসোর্সটিকে আলাদাভাবে সনাক্ত করবে।
ইন Class.getResourceAsStream(path)
, পাথটিকে আপনি যে শ্রেণীর কাছ থেকে কল করছেন তার প্যাকেজের স্থানীয় পথ হিসাবে ব্যাখ্যা করা হয়েছে। উদাহরণস্বরূপ কলিং জন্য, String.getResourceAsStream("myfile.txt")
নিম্নলিখিত অবস্থানে আপনার ক্লাসপাথ মাধ্যমে কোনো ফাইল দেখতে হবে: "java/lang/myfile.txt"
। যদি আপনার পথটি একটি দিয়ে শুরু হয় /
, তবে এটি একটি পরম পথ হিসাবে বিবেচিত হবে এবং শ্রেণিপথের মূল থেকে অনুসন্ধান শুরু করবে। সুতরাং কলিংটি String.getResourceAsStream("/myfile.txt")
আপনার শ্রেণীর পথে নিম্নলিখিত অবস্থানটি দেখবে ./myfile.txt
।
ClassLoader.getResourceAsStream(path)
সমস্ত পাথকে পরম পথ হিসাবে বিবেচনা করবে। তাই কলিং String.getClassLoader().getResourceAsStream("myfile.txt")
এবং String.getClassLoader().getResourceAsStream("/myfile.txt")
নিম্নলিখিত অবস্থানে আপনার ক্লাসপাথ একটি ফাইল জন্য উভয় বর্ণন: ./myfile.txt
।
যতবার আমি এই পোস্টে কোনও অবস্থান উল্লেখ করি, এটি আপনার ফাইল সিস্টেমে নিজেই বা সংশ্লিষ্ট জার ফাইলের ভিতরে অবস্থিত হতে পারে, আপনি যে শ্রেণীর এবং / অথবা ClassLoader থেকে উত্সটি লোড করছেন তার উপর নির্ভর করে।
আপনার ক্ষেত্রে, আপনি একটি অ্যাপ্লিকেশন সার্ভার থেকে ক্লাসটি লোড করছেন, সুতরাং আপনার Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName)
পরিবর্তে ব্যবহার করা উচিত this.getClass().getClassLoader().getResourceAsStream(fileName)
। this.getClass().getResourceAsStream()
কাজ করবে।
নির্দিষ্ট সমস্যা সম্পর্কে আরও বিস্তারিত তথ্যের জন্য এই নিবন্ধটি পড়ুন ।
টমক্যাট 7 এবং নীচের ব্যবহারকারীদের জন্য সতর্কতা
এই প্রশ্নের উত্তরের একটিতে বলা হয়েছে যে টমক্যাট for এর জন্য আমার ব্যাখ্যাটি ভুল বলে মনে হচ্ছে why আমি কেন আশেপাশে দেখার চেষ্টা করেছি that
সুতরাং আমি টমক্যাট এর সোর্স কোডটি টমকেটের WebAppClassLoader
বিভিন্ন সংস্করণের জন্য দেখেছি। বাস্তবায়ন findResource(String name)
(যা অনুরোধকৃত রিসোর্চ করতে URL উৎপাদন জন্য utimately দায়ী) হুল বিড়াল 6 এবং হুল বিড়াল 7 কার্যত অভিন্ন, কিন্তু হুল বিড়াল 8 ভিন্ন।
সংস্করণ 6 এবং In এ, বাস্তবায়ন সংস্থানটির নামটি স্বাভাবিক করার চেষ্টা করে না। এর অর্থ এই যে এই সংস্করণগুলিতে ইভেন্টের classLoader.getResourceAsStream("/resource.txt")
মতো একই ফলাফল নাও আসতে পারে classLoader.getResourceAsStream("resource.txt")
(যেহেতু জাভাদোক নির্দিষ্ট করে)। [সোর্স কোড]
ভার্সন ৮-এ যদিও, এই সংস্থার গ্যারান্টির জন্য রিসোর্সের নামটি স্বাভাবিক করা হয়েছে যে ব্যবহৃত হওয়া সংস্থার নামের পরম সংস্করণ is সুতরাং, টমক্যাট 8-এ, উপরে বর্ণিত দুটি কলের সর্বদা একই ফলাফলটি ফিরে আসা উচিত। [সোর্স কোড]
ফলস্বরূপ, আপনি ব্যবহার করছেন অতিরিক্ত সতর্ক হতে হবে ClassLoader.getResourceAsStream()
বা Class.getResourceAsStream()
তার আগে হুল বিড়াল সংস্করণের উপর 8. চেয়ে আর তুমি যে মনে রাখা উচিত নয় class.getResourceAsStream("/resource.txt")
আসলে কল classLoader.getResourceAsStream("resource.txt")
(নেতৃস্থানীয় /
ছিনতাই করা হয়)।
getClass().getResourceAsStream("/myfile.txt")
থেকে আলাদা আচরণ করেgetClassLoader().getResourceAsStream("/myfile.txt")
।