জাভায় আপেক্ষিক পথ সহ ওপেন রিসোর্স


84

আমার জাভা অ্যাপে আমার কিছু ফাইল এবং ডিরেক্টরি পাওয়া দরকার get

এটি প্রোগ্রাম কাঠামো:

./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.class.getClass().getResource("repository/SSL-Key/cert.jks").toString()

আসল পথ পেতে, কিন্তু এই উপায় কাজ করে না।

ডিরেক্টরিটির জন্য কোন পাথটি ব্যবহার করতে হবে তা আমার কোনও ধারণা নেই।


4
class.getClass () Class.getClassLoader () এর মতো নয়। এছাড়াও আরও একটি সমাধান রয়েছে, আপনার রিসোর্স হিসাবে একই প্যাকেজের কোনও ক্লাস ব্যবহার করে getResourceAsStream () পান। আরও তথ্যের জন্য: tshikatshikaaa.blogspot.nl/2012/07/…
জেরুমে ভার্সট্রিঞ্জ

এছাড়াও দেখুন
স্ট্যাকওভারফ্লো.

উত্তর:


48

ক্লাসলোডারের সাথে সম্পর্কিত পাথ সরবরাহ করুন, আপনি যে শ্রেণীর কাছ থেকে লোডার পাচ্ছেন তা নয়। এই ক্ষেত্রে:

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

161

getClass().getResource("filename.txt")পদ্ধতিটি ব্যবহারে আমার সমস্যা ছিল । জাভা ডক্স নির্দেশাবলী পড়ার পরে, যদি আপনার উত্সটি আপনি যে শ্রেণীর থেকে সংস্থানটি অ্যাক্সেস করার চেষ্টা করছেন তার মতো প্যাকেজে না থাকে, তবে আপনাকে এটিকে শুরু করে আপেক্ষিক পথটি দিতে হবে '/'। প্রস্তাবিত কৌশলটি হ'ল আপনার সংস্থান ফাইলগুলি মূল ডিরেক্টরিতে "রিসোর্স" ফোল্ডারের নিচে রাখা। সুতরাং উদাহরণস্বরূপ যদি আপনার কাঠামো থাকে:

src/main/com/mycompany/myapp

তারপরে আপনি মাভেন দ্বারা প্রস্তাবিত হিসাবে একটি সংস্থান ফোল্ডার যুক্ত করতে পারেন:

src/main/resources

এছাড়াও আপনি সংস্থানসমূহ ফোল্ডারে সাবফোল্ডার যুক্ত করতে পারেন

src/main/resources/textfiles

এবং বলুন যে আপনার ফাইলটি তাই বলা myfile.txtহয়েছে

src/main/resources/textfiles/myfile.txt

এখন এখানে মূ the় পাথ সমস্যাটি আসে। বলুন আপনার একটি ক্লাস রয়েছে 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")

এটি আর শূন্য হবে না, তবে আপনার ক্লাসটি ফিরিয়ে দেবে। আমি এই কারো সাহায্য করে আশা করি। আমার কাছে আশ্চর্যের বিষয়, "resources"ফোল্ডারটি পাশাপাশি অনুলিপি করা হয়নি, তবে কেবল "resources"ফোল্ডারে কেবল সাবফোল্ডার এবং ফাইল । এটি আমার কাছে যৌক্তিক মনে হবে যে "resources"ফোল্ডারটিও নীচে পাওয়া যাবে"myapp/target/classes"


4
আমার মধ্যে target/classes, আমি কেবলমাত্র প্রধান সংস্থানসমূহের অধীনে ফাইলগুলি দেখতে পারি এবং পরীক্ষার সংস্থানগুলিতে নয়। কেন?
আভা

@ আভা আপনার উত্স ফোল্ডার হিসাবে পরীক্ষার ফোল্ডার যুক্ত করুন এবং আপনি যেতে ভাল!
আকাশ পরাশার

@ আভা, নিশ্চিত যে এটি আপনার জন্য দেরী উত্তর, তবে কাউকে সাহায্য করতে পারে। আপনি চালানো প্রয়োজন mvn clean test-compileযেমন পর যায়, কমান্ড compileমধ্যে ম্যাভেন জীবনচক্র । যে উত্পন্ন হবে target/test-classes
আলেকজান্ডার রাডচেনকো

35

যারা অন্যদের মতো এটি দ্রুত গ্রহণ করেন না তাদের জন্য অতিরিক্ত তথ্য সরবরাহের আশায় আমি আমার পরিস্থিতিটি কিছুটা আলাদা সেটআপ করার কারণে এটি সরবরাহ করতে চাই। আমার প্রকল্পটি নিম্নলিখিত ডিরেক্টরি কাঠামোর (উপগ্রহ ব্যবহার করে) সেটআপ করা হয়েছিল:

প্রকল্প /
  src / // অ্যাপ্লিকেশন উত্স কোড
    org /
      আমার প্রকল্প/
        মাইক্লাস.জভা
  পরীক্ষা / // ইউনিট পরীক্ষা
  res / // সংস্থানসমূহ
    আইকনগুলির জন্য চিত্র / // পিএনজি চিত্র
      my-image.png
    জ্যাকএক্সবি দিয়ে এক্সএমএল ফাইলগুলি যাচাই করার জন্য এক্সএমএল / // এক্সএসডি ফাইল
      আমার-স্কিমা.এক্সএসডি
    লগ 4j এর জন্য কনফারেন্স / // ডিফল্ট .কনফ ফাইল
      log4j.conf
  lib / // লাইব্রেরিগুলি প্রকল্প সেটিংসের মাধ্যমে বিল্ড-পাথে যুক্ত হয়েছে

রেজ ডিরেক্টরি থেকে আমার সংস্থানগুলি লোড করার ক্ষেত্রে আমার সমস্যা ছিল । আমি আমার সমস্ত উত্স আমার উত্স কোড থেকে পৃথক চেয়েছিলাম (কেবল পরিচালনা / সংস্থার উদ্দেশ্যে)। সুতরাং, আমাকে যা করতে হয়েছিল তা হ'ল বিল্ড-পাথে পুনর্নির্দেশের ডিরেক্টরিটি যুক্ত করুন এবং তারপরে উত্সটি অ্যাক্সেস করুন:

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 (STRING) পরিবর্তে Class.getResource (STRING)


4
। + 1 ক্লাসলোডার পরামর্শ দেওয়ার জন্য
pyb

4
এই বিষয়ে সেরা উত্তর! /কোনও সংস্থান পথের শুরুতে ব্যবহার না করার টিপটি কী ছিল!
কাহাদরিন

10

আপনি যখন ক্লাসে 'গেটআরসোর্স' ব্যবহার করেন, ক্লাসটি যে প্যাকেজটিতে থাকে তার উপর ভিত্তি করে একটি আপেক্ষিক পথটি সমাধান করা হয় Class

আপনি যদি একটি নিখুঁত পাথ ব্যবহার করেন তবে দুটি 'getResource' পদ্ধতি মূল ফোল্ডারে শুরু হবে।


এর প্রভাবগুলি ভুলে যাবেন না/
গিলবার্তো

@ এনবিয়ার কেন getResourceনিখুঁত পাথ ব্যবহার করে মূল ফোল্ডারে শুরু হয়? পরম পথের উদ্দেশ্য কি পরম নয় ?
atjua

10

@ জিয়ানকার্লো: আপনি সিস্টেমের প্রোপার্টি ইউজার.ডিরকে কল করার চেষ্টা করতে পারেন যা আপনাকে আপনার জাভা প্রকল্পের মূল দেবে এবং তারপরে এই পথটিকে আপনার আপেক্ষিক পথে সংযুক্ত করবে:

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);

4
ওপি ক্লাসপথে একটি সংস্থান সন্ধান করতে চেয়েছিল (সম্ভবত সম্ভবত বিল্ডের সময় উত্পন্ন জারের মধ্যে)। এই পদ্ধতিটি লক্ষ্য অর্জনের কোনও উপায় সরবরাহ করে না - আপনি Fileএকটি জার ফাইলের অভ্যন্তরে কোনও উত্সকে নির্দেশ করতে পারবেন না , কেবলমাত্র ফাইল সিস্টেমে সঠিক প্রবেশের জন্য (যেমন জার নিজেই)।
আটটিলা

পছন্দসই পথটি দেখতে "ইউজার.ডির" পাওয়ার ধারণাটি আমি পছন্দ করি। ধন্যবাদ
YouAreAwesome

5

গ্রহন + maven ব্যবহারকারীদের জন্য। বলুন আপনি ফাইলটি অ্যাক্সেস করার চেষ্টা images/pic.jpgকরছেন src/main/resources। এটি এইভাবে করা:

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

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


2
resourcesloader.class.getClass()

এটিকে ভেঙে ফেলা যায়:

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

যার অর্থ আপনি বুটস্ট্র্যাপ শ্রেণি ব্যবহার করে সংস্থানটি লোড করার চেষ্টা করছেন।

পরিবর্তে আপনি সম্ভবত এর মতো কিছু চান:

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

যদি কেবল জাভ্যাক অ স্থির প্রসঙ্গে স্ট্যাটিক পদ্ধতিগুলি কল করার বিষয়ে সতর্ক করে থাকে ...


1

নিম্নলিখিত কাজ কি?

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

প্যাকেজ সহ আপনি পুরো পথ নির্দিষ্ট করতে না পারার কোনও কারণ আছে?


1

উপরে উল্লিখিত হিসাবে দুটি উত্তর নিয়ে যাচ্ছি। প্রথমটি

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

এক এবং একই জিনিস হওয়া উচিত?


1

ফাইলটির আসল পথ অর্জন করার জন্য আপনি এটি চেষ্টা করতে পারেন:

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

রিসোর্সলোডার এখানে শ্রেণীবদ্ধ। "রিসোর্স / রিপোজিটরি / এসএসএল-কী / cert.jks" ফাইলটির আপেক্ষিক পথ। বাকী ফোল্ডার কাঠামোর বাকী অংশে যদি আপনার গিচগ্লাস থাকে। / প্যাকেজ 1 / জাভাতে, আপেক্ষিক পথটি সংজ্ঞায়িত করার নিয়মগুলির কারণে আপনি "../resources/repository/SSL-Key/cert.jks" কে আপেক্ষিক পথ হিসাবে গ্রহণ করবেন।

এইভাবে আপনি বাফারড্রিডার দিয়ে আপনার ফাইলটি পড়তে পারেন। ফাইলটির পাথ শনাক্ত করার জন্য STRING টি ব্যবহার করবেন না, কারণ আপনার পাতায় ইংরেজি বর্ণমালা না থেকে ফাঁকা বা কিছু অক্ষর থাকলে আপনার সমস্যা হবে এবং ফাইলটি পাওয়া যাবে না।

BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(fileUrl.openStream()));

0

.getFile()নাল পয়েন্টার ব্যতিক্রম এড়াতে এবং ডেটা ডিরেক্টরিতে পথ নির্ধারণ করার জন্য আমি @ জোনাথন.কোন এর একটি লাইনারে (যুক্ত করে ) একটি ছোট পরিবর্তন করেছি । আমার জন্য যা কাজ করেছে তা এখানে:

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

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