ফাইল হিসাবে জাভা রিসোর্স


122

ক্লাস লোডারের মাধ্যমে জার থেকে উদ্ধারকৃত কোনও উত্সে ফাইলের উদাহরণ তৈরির জাভাতে কি কোনও উপায় আছে?

আমার অ্যাপ্লিকেশনটি জার (ডিফল্ট) বা রানটাইম (ব্যবহারকারী ইনপুট) এ নির্দিষ্ট করা ফাইল সিস্টেম ডিরেক্টরি থেকে কিছু ফাইল ব্যবহার করে। আমি
ক) একটি ধারাবাহিক উপায় সন্ধান করছি ) এই ফাইলগুলি একটি স্ট্রিম হিসাবে লোড করা
খ) ব্যবহারকারী-সংজ্ঞায়িত ডিরেক্টরিতে বা জারে ডিরেক্টরিতে ডিরেক্টরিতে ফাইলগুলি যথাক্রমে তালিকাভুক্ত করা হচ্ছে?

সম্পাদনা: স্পষ্টতই, আদর্শ পন্থাটি java.io.File সম্পূর্ণরূপে দূরে থাকাই হবে। ক্লাসপথ থেকে ডিরেক্টরি লোড করার এবং এর বিষয়বস্তুগুলি (এতে থাকা ফাইল / সত্তা) তালিকাভুক্ত করার কোনও উপায় আছে কি?

উত্তর:


58

ClassLoader.getResourceAsStreamএবং Class.getResourceAsStreamঅবশ্যই এটি সংস্থান ডেটা লোড করার উপায় go তবে আমি বিশ্বাস করি না যে শ্রেণিপথের কোনও উপাদানগুলির বিষয়বস্তু "তালিকা" দেওয়ার কোনও উপায় আছে।

কিছু ক্ষেত্রে এটি কেবল অসম্ভব হতে পারে - যেমন, একটি ClassLoader পারে , মাছি ডেটা উৎপন্ন কি রিসোর্স নাম এটি জন্য জিজ্ঞাসা হচ্ছে উপর ভিত্তি করে। আপনি যদি ClassLoaderএপিআইয়ের দিকে লক্ষ্য করেন (যা মূলত ক্লাসপাথ প্রক্রিয়াটির মাধ্যমে কাজ করে) আপনি দেখতে পাবেন যে যা চান তা করার কিছুই নেই।

আপনি যদি জানেন যে আপনার কাছে আসলে একটি জার ফাইল রয়েছে, তবে ZipInputStreamকী পাওয়া যায় তা খুঁজে পেতে আপনি এটি লোড করতে পারেন । এর অর্থ হ'ল ডিরেক্টরি এবং জার ফাইলগুলির জন্য আপনার কাছে আলাদা কোড থাকবে।

একটি বিকল্প, যদি ফাইলগুলি প্রথমে পৃথকভাবে তৈরি করা হয় তবে তা হ'ল উপলব্ধ সংস্থানগুলির তালিকা সহ এক ধরণের ম্যানিফেস্ট ফাইল অন্তর্ভুক্ত করা উচিত। জার ফাইলটিতে এটি বান্ডিল করুন বা ফাইল ফাইল ফাইল হিসাবে এটি অন্তর্ভুক্ত করুন এবং ব্যবহারকারীর পছন্দসই সংস্থান দেওয়ার আগে লোড করুন।


3
আমি সম্মত হই যে এটি বিরক্তিকর - তবে এটি ClassLoader কে অন্যান্য উপায়ে আরও ব্যাপকভাবে প্রয়োগ করে। উদাহরণস্বরূপ, একটি "ওয়েব ক্লাসলোডার" লেখা সহজ কারণ ওয়েব ফাইল আনার জন্য ওয়েব ভাল, তবে এটি সাধারণত ফাইলগুলির তালিকা করে না ।
জন স্কিটি

দেখে মনে হচ্ছে যে আপনি যে সংস্থানটি লোড করার চেষ্টা করছেন সেটি InputStreamযদি 1 মিবের চেয়ে বড় হয় তবে আপনি getResourceAsStreamআকারের পরে রিসোর্সের বাইটগুলি পুনরুদ্ধার করতে স্টপগুলি থেকে পেয়ে যান এবং পরিবর্তে 0 যদি এটি একটি জারের মতো সংকোচিত ফাইল সিস্টেমে অন্তর্ভুক্ত থাকে তবে ফিরে আসে। আপনি getResourceএই ক্ষেত্রে এ থেকে স্বাধীনভাবে ফাইলটি ব্যবহার এবং লোড করতে বাধ্য হয়েছেন বলে মনে হয় ।
এমজিগ্লিটিংগার

1
@ এমজিটিলিংগার: এটি আমার কাছে অসম্ভব বলে মনে হচ্ছে ... আপনি যদি পারেন তবে রেপ্রো সহ একটি নতুন প্রশ্ন পোস্ট করা ভাল।
জন স্কিটে

সমস্যাটি readকতটা পড়তে হবে তা সিদ্ধান্ত নেওয়ার কারণে হয়েছিল (আমি সে সম্পর্কে অবগত ছিলাম না)। এবং দেখে মনে হয় যে পুরো ফাইলটি পড়ছে যদি ফাইলটি নিয়মিত ফোল্ডারে অবস্থিত থাকে। ফাইলটি যদি কোনও পাত্রের মধ্যে থাকে কারণ এটি প্যাকেজ করা হয়েছে এটি এর কেবলমাত্র কিছু অংশ পড়ে reads
মিগ্রাটলিংগার

1
@ এমজিটিটিলিংগার: না, এটি কেবল এর অংশগুলি পড়বে না - তবে এটি প্রতিটি পঠিত কলে প্রদত্ত পুরো বাফারটি পূরণ করতে পারে না। সর্বদা হিসাবে InputStream, আপনি যদি পুরো রিসোর্সটি পড়তে চান তবে আপনার readফিরে আসা -1 হওয়া পর্যন্ত লুপ হওয়া উচিত ।
জন স্কিটি

98

আমার একই সমস্যা ছিল এবং নিম্নলিখিতগুলি ব্যবহার করতে সক্ষম হয়েছি:

// Load the directory as a resource
URL dir_url = ClassLoader.getSystemResource(dir_path);
// Turn the resource into a File object
File dir = new File(dir_url.toURI());
// List the directory
String files = dir.list()

45
এই পদ্ধতির ক্লাসপথে জেআরগুলির সাথে কাজ করে না, কেবল ফাইল এবং ডিরেক্টরি সহ
ইয়েজোর 256

1
@ ইয়েগোর 256 আপনার ফাইলটি জারে থাকলে আপনি একটি FileSystemবস্তু তৈরি করতে পারেন এবং এটি Pathথেকে তা পেতে পারেন । তাহলে আপনি এটি যথারীতি পড়তে পারেন। (দেখুন stackoverflow.com/a/22605905/1876344 )
mgttlinger

53

আমার অ্যাপ্লিকেশনগুলির একটির থেকে কোডটি এখানে দেওয়া হয়েছে ... এটি আপনার প্রয়োজনীয়তার জন্য উপযুক্ত কিনা তা আমাকে জানান। আপনি যে ফাইলটি ব্যবহার করতে চান তা যদি আপনি জানেন তবে আপনি এটি ব্যবহার করতে পারেন।

URL defaultImage = ClassA.class.getResource("/packageA/subPackage/image-name.png");
File imageFile = new File(defaultImage.toURI());

আশা করি এইটি কাজ করবে.


হ্যাঁ ইসট না, তবে toURI()ব্যর্থ হবে।
অলিভিয়ার ফাওচাক্স

10

একটি জার থেকে উদ্ধার করা কোনও সংস্থার উপর ফাইলের উদাহরণ তৈরির একটি নির্ভরযোগ্য উপায় হ'ল সংস্থানটিকে অস্থায়ী ফাইলে স্ট্রিম হিসাবে অনুলিপি করা (টেম্প ফাইলটি মুছে ফেলা হবে যখন JVM প্রস্থান করবে):

public static File getResourceAsFile(String resourcePath) {
    try {
        InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath);
        if (in == null) {
            return null;
        }

        File tempFile = File.createTempFile(String.valueOf(in.hashCode()), ".tmp");
        tempFile.deleteOnExit();

        try (FileOutputStream out = new FileOutputStream(tempFile)) {
            //copy stream
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
        }
        return tempFile;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

4

এটা চেষ্টা কর:

ClassLoader.getResourceAsStream ("some/pkg/resource.properties");

আরও কিছু পদ্ধতি উপলব্ধ রয়েছে, যেমন এখানে দেখুন: http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html


আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ. আমি getResourceAsStream সম্পর্কে জানি, তবে আমি মনে করি না যে আমি এর মাধ্যমে ক্লাসপথ থেকে কোনও ডিরেক্টরি লোড করতে পারি।
মন্ত্র্রাম

জাভা ডিরেক্টরিতে একটি ফাইল (ইউনিক্স শিকড়গুলি আমি অনুমান করি) তাই আপনার অন্তত চেষ্টা করা উচিত।
টপচেফ

আমি আপনাকে java.io.File ব্যবহার করতে হবে এমন একটি ডিরেক্টরিতে ফাইলগুলি তালিকাভুক্ত করার জন্য মনে করি। আপনি ClassLoader.findResource এর সাহায্যে ফাইলগুলি সন্ধান করতে পারেন যা কোনও ইউআরএল ফিরিয়ে দেয় যা ফাইলকে দেওয়া যেতে পারে।
নাথান ভক্সল্যান্ড

2

এটি একটি বিকল্প: http://www.uofr.net/~greg/java/get-resource-listing.html


4
এই লিঙ্কটি প্রশ্নের উত্তর দিতে পারে, তবে এখানে উত্তরের প্রয়োজনীয় অংশগুলি অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্কটি সরবরাহ করা ভাল, কারণ কোনও লিঙ্ক পরিবর্তন হতে পারে বা লিঙ্কযুক্ত পৃষ্ঠাটি মুছে ফেলা হতে পারে, যার ফলে উত্তরটি অকেজো হয়ে যায়।
জোনাসসিজে - মনিকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.