java.io.File
এবং স্ত্রীদেরকে স্থানীয় ডিস্কে ফাইল সিস্টেমে কাজ করে। আপনার সমস্যার মূল কারণ হ'ল আপেক্ষিক পাথগুলি java.io
বর্তমান ওয়ার্কিং ডিরেক্টরিের উপর নির্ভরশীল। অর্থাৎ যে ডিরেক্টরি থেকে জেভিএম (আপনার ক্ষেত্রে: ওয়েবসারকের একটি) শুরু হয়েছে। এই উদাহরণস্বরূপ হতে পারে C:\Tomcat\bin
বা কিছু সম্পূর্ণরূপে ভিন্ন, কিন্তু এইভাবে না C:\Tomcat\webapps\contextname
বা যাই হোক না কেন আপনি এটা বলে আশা করা চাই। একটি সাধারণগ্রহণ প্রকল্পে, এটি হবে C:\Eclipse\workspace\projectname
। আপনি বর্তমান ওয়ার্কিং ডিরেক্টরিটি নিম্নলিখিত পদ্ধতিতে শিখতে পারেন:
System.out.println(new File(".").getAbsolutePath());
তবে, ওয়ার্কিং ডিরেক্টরি কোনওভাবেই প্রোগ্রামিকভাবে নিয়ন্ত্রণযোগ্য নয়। আপনার সত্যিকারের আপেক্ষিক পাথের পরিবর্তে API এ পরম পাথগুলি ব্যবহার করা পছন্দ করা উচিত File
prefer যেমনC:\full\path\to\file.ext
।
আপনি জাভা (ওয়েব) অ্যাপ্লিকেশনগুলিতে হার্ডকোড বা পরম পাথ অনুমান করতে চান না। এটি কেবল পোর্টেবিলিটি সমস্যা (যেমন এটি সিস্টেম এক্সে চলে, তবে সিস্টেম ওয়াই তে নয়)। সাধারণ অনুশীলন হ'ল এই ধরণের সংস্থানগুলি ক্লাসপথে রাখুন , বা শ্রেণিপথের সাথে তার সম্পূর্ণ পথ যুক্ত করা (একক্লিপের মতো আইডিইতে যেটি src
ফোল্ডার এবং যথাক্রমে "বিল্ড পাথ" থাকে)। এইভাবে আপনি ClassLoader
দ্বারা ClassLoader#getResource()
বা এর সাহায্যে তাদের দখল করতে পারেন ClassLoader#getResourceAsStream()
। এটি আপনার ক্লাসপ্যাথের "মূল" এর সাথে সম্পর্কিত ফাইলগুলি সনাক্ত করতে সক্ষম, যেমনটি আপনি কাকতালীয়ভাবে আবিষ্কার করেছিলেন। ওয়েব অ্যাপ্লিকেশনগুলিতে (বা অন্য কোনও অ্যাপ্লিকেশন যা একাধিক ক্লাসলোডার ব্যবহার করে) এতে এটির জন্য ClassLoader
প্রত্যাবর্তিত হিসাবে ব্যবহার করার পরামর্শ দেওয়া হয় Thread.currentThread().getContextClassLoader()
যাতে আপনি ওয়েবঅ্যাপের প্রসঙ্গটিও "বাইরে" দেখতে পারেন।
ওয়েব অ্যাপসে অন্য বিকল্প হ'ল ServletContext#getResource()
এবং এর সমকক্ষ ServletContext#getResourceAsStream()
। এটি web
ফোল্ডার সহ ওয়েব অ্যাপ্লিকেশন প্রকল্পের সর্বজনীন ফোল্ডারে থাকা ফাইলগুলিতে অ্যাক্সেস করতে সক্ষম /WEB-INF
। ServletContext
উত্তরাধিকারসূত্রে দ্বারা সার্ভলেট পাওয়া যায়getServletContext()
পদ্ধতি, আপনি কল করতে পারেন এটা হিসাবে হয়।
আরো দেখুন: