আপনার প্রকল্পের / রিসোর্স ফোল্ডারে ফাইলের নিখুঁত পথ কীভাবে পাবেন


95

মানক মাভেন সেটআপ ধরে নিই।

আপনার সংস্থান ফোল্ডারে বলুন আপনার কাছে একটি ফাইল আছে abc

জাভাতে, আমি কীভাবে দয়া করে ফাইলটির সম্পূর্ণ পথ পেতে পারি?


আপনি কি কোন ম্যাভেন প্লাগইন লিখতে চান? বা আপনার প্রোগ্রামটি কার্যকর হলে আপনি ফাইলটি অ্যাক্সেস করতে চান?
গাইরো গিয়ারলেস


: এখন পর্যন্ত, পরিস্থিতির উপর নির্ভর করে সমাধান তিন রূপের হয় stackoverflow.com/a/56327069/715269
Gangnus

উত্তর:


73

ClassLoader.getResourceসঠিক সংস্থান পেতে আপনি পদ্ধতিটি ব্যবহার করতে পারেন ।

URL res = getClass().getClassLoader().getResource("abc.txt");
File file = Paths.get(res.toURI()).toFile();
String absolutePath = file.getAbsolutePath();

বা

যদিও এটি সবসময় কাজ না করে, একটি সহজ সমাধান -

আপনি একটি Fileঅবজেক্ট তৈরি করতে পারেন এবং getAbsolutePathপদ্ধতিটি ব্যবহার করতে পারেন :

File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();

8
সীমিত ব্যবহারের পরামর্শ, কারণ এটি কাজের ডিরেক্টরিটি মভেন রুট হিসাবে নির্ভর করে। এবং তারপরেও আপনার পরিবর্তে target/classes/abc.txtফাইলটি রেফারেন্স করা উচিত , কারণ এটি হ'ল প্রামাণ্য জায়গা যেখানে প্রক্রিয়া করার পরে মাভেন রিসোর্স ফাইল রাখে (উদাহরণস্বরূপ, মভেন-রিসোর্স প্লাগইনটি abc.txt এ সম্পত্তি পরিবর্তনের কাজ করতে পারে)। ক্লাসপথ থেকে getResource () এর মাধ্যমে abc.txt ব্যবহার করা আরও ভাল।
গাইরো গিয়ারলেস

4
যদি কোনও শেষ ব্যবহারকারী কোনও এক্সিকিউটেবল জেআর হিসাবে আপনার অ্যাপ্লিকেশনটি চালাচ্ছেন? তারপরে কোনও শারীরিক ফাইল থাকবে না। এটি getResource () ব্যবহার করা উচিত, এবং যেমন আপনি এটি করতে চান তার উপর নির্ভর করে ওপেন ইনপুট স্ট্রিম ব্যবহারের অন্য কারণ is
ম্যাথু ওয়াইজ

6
এটি কি সঠিক উত্তর হিসাবে মুছে ফেলা যাবে? @ কারোল এস নীচে উত্তর দিয়েছেন - এটি সঠিক উত্তর হওয়া উচিত (অতএব
উত্থানের

4
ভুল উত্তর. @ কারোল
ভাটিয়া-পেরের

167

প্রকৃতপক্ষে সঠিকভাবে কাজ করে:

URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();

ক্লাসপথের ফাইলটি শারীরিকভাবে যেখানে এখন তা বিবেচ্য নয়, যতক্ষণ রিসোর্সটি আসলে কোনও ফাইল এবং জআর এন্ট্রি নয় ততক্ষণ এটি পাওয়া যাবে।

(আপাতদৃষ্টিতে সুস্পষ্টভাবে new File(resource.getPath())সমস্ত পাথের জন্য কাজ করে না! পথটি এখনও ইউআরএল-এনকোডড!)


4
অথবা সম্ভবত আপনি কেবল এটি করতে পেরেছিলেন: new File(resource.toURI()).getAbsolutePath();(যেমন আমি মনে করি না যে আপনাকে পাথ অবজেক্টের দরকার আছে?)
ড্যান কিং

4
টুরি () সম্পর্কে ভাল পরামর্শ, এটি আপনার পথে ফাঁকা স্থানগুলি% 20 এর হিসাবে প্রকাশ্যে এড়িয়ে চলে!
ম্যাথু ওয়াইজ

29
ধন্যবাদ! এটি প্রায় আমার জন্য কাজ করে। তবে আমাকে একটি পরিবর্তন করতে হয়েছিল: আপনারক্লাস।
yngwietiger

আপনি new File(YourClass.class.getResource("abc").toURI().getPath())যদি চান তবে পর্যায়ক্রমে করতে পারেন।
মাইক রাইল্যান্ডার

4
আমি বুঝতে পারছি না যে এটি কীভাবে এত লোকের জন্য কাজ শুরু করে স্ল্যাশ ছাড়াই:.getResource("/abc")
২hen

28

আপনার নির্দিষ্ট পথটি শুরু করা দরকার /

URL resource = YourClass.class.getResource("/abc");
Paths.get(resource.toURI()).toFile();

12

আপনার প্রয়োজনীয় ক্লাসের ক্লাসলুডার উদাহরণটি তৈরি করুন, তারপরে আপনি ফাইলগুলি বা সংস্থানগুলি সহজেই অ্যাক্সেস করতে পারবেন। এখন আপনি getPath()সেই শ্রেণীর পদ্ধতি ব্যবহার করে পাথ অ্যাক্সেস করতে পারেন ।

 ClassLoader classLoader = getClass().getClassLoader();
 String path  = classLoader.getResource("chromedriver.exe").getPath();
 System.out.println(path);

1

কোনও ফাইল বা ফাইলপথ ফেরত দিতে

URL resource = YourClass.class.getResource("abc");
File file = Paths.get(resource.toURI()).toFile(); // return a file
String filepath = Paths.get(resource.toURI()).toFile().getAbsolutePath();  // return file path

0

পরম পথে আমাদের পথে দুটি সমস্যা রয়েছে:

  1. প্রাপ্ত স্থান নির্ধারণটি যেখানে উত্স ফাইলগুলি থাকে সেখানে নয়, যেখানে শ্রেণিটি সংরক্ষণ করা হবে। এবং রিসোর্স ফোল্ডারটি অবশ্যই প্রকল্পের উত্স ফোল্ডারে কোথাও থাকবে।
  2. উত্সটি পুনরুদ্ধার করার জন্য একই কাজগুলি ক্লাসটি কোনও প্লাগইনে বা সরাসরি ওয়ার্কস্পেসে কোনও প্যাকেজে চালিত হলে আলাদাভাবে কাজ করে।

নিম্নলিখিত কোডটি আমাদের সমস্ত কার্যকর পাথ দেবে:

    URL localPackage = this.getClass().getResource("");
    URL urlLoader = YourClassName.class.getProtectionDomain().getCodeSource().getLocation();
    String localDir = localPackage.getPath();
    String loaderDir = urlLoader.getPath();
    System.out.printf("loaderDir = %s\n localDir = %s\n", loaderDir, localDir);

এখানে উভয় ফাংশন যা রিসোর্স ফোল্ডারের স্থানীয়করণের জন্য ব্যবহার করা যেতে পারে তা গবেষণা করা হয়। হিসাবে class, এটি কোনও উপায়ে, স্থিতিশীল বা গতিশীলভাবে পাওয়া যেতে পারে।


যদি প্রকল্পটি প্লাগইনে না থাকে, JUnit এ চালিত কোডটি মুদ্রণ করবে:

loaderDir = /C:.../ws/source.dir/target/test-classes/
 localDir = /C:.../ws/source.dir/target/test-classes/package/

সুতরাং, এসসিআর / বিশ্রাম / সংস্থানগুলিতে যাওয়ার জন্য আমাদের ফাইল ট্রি উপরে এবং নীচে যাওয়া উচিত। উভয় পদ্ধতি ব্যবহার করা যেতে পারে। লক্ষ্য করুন, আমরা ব্যবহার করতে পারি না getResource(resourceFolderName), কারণ সেই ফোল্ডারটি লক্ষ্য ফোল্ডারে নেই। আশা করি কেউ তৈরি ফোল্ডারে সংস্থান রাখে না।


ক্লাসটি প্লাগইনে থাকা প্যাকেজে থাকলে একই পরীক্ষার আউটপুট হবে:

loaderDir = /C:.../ws/plugin/bin/
 localDir = /C:.../ws/plugin/bin/package/

সুতরাং, আবার আমাদের ফোল্ডার ট্রি উপরে এবং নীচে যেতে হবে।


প্যাকেজটি প্লাগ-ইন চালু হওয়ার পরে সবচেয়ে আকর্ষণীয় বিষয়টি । JUnit প্লাগইন পরীক্ষা হিসাবে, আমাদের উদাহরণ হিসাবে। আউটপুটটি হ'ল:

loaderDir = /C:.../ws/plugin/
 localDir = /package/

এখানে আমরা উভয় ফাংশনের ফলাফলের সংমিশ্রণে পরম পথ পেতে পারি । এবং এটি যথেষ্ট নয়। তাদের মধ্যে আমাদের সেই ক্লাসের প্যাকেজগুলির স্থানের স্থানীয় পথটি তুলনামূলকভাবে প্লাগইন ফোল্ডারে রাখা উচিত। সম্ভবত, আপনাকে এখানে srcবা src/test/resourceএখানে কিছু সন্নিবেশ করতে হবে ।

আপনি কোডটি নিজের মধ্যে sertোকাতে এবং আপনার যে পাথগুলি রয়েছে তা দেখতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.