আমি এখনই সম্পূর্ণ বিভ্রান্ত - বেশিরভাগ পরিভাষার কারণে, আমার ধারণা। কেউ দয়া করে আমাকে পার্থক্যের মধ্য দিয়ে চলতে পারেন, বা ডামি-প্রমাণ সামগ্রীতে কয়েকটি লিঙ্ক সরবরাহ করতে পারেন? বিশেষত ইউআরআই থেকে ইউআরআই এবং ফাইল থেকে রিসোর্স? আমার কাছে মনে হচ্ছে, যথাক্রমে তাদের একই জিনিস হওয়া উচিত ...
পরিভাষাটি বিভ্রান্তিমূলক এবং কখনও কখনও বিস্মৃত হয় এবং বেশিরভাগই জাভা উভয়ই এপিআই এবং সময়ের সাথে প্ল্যাটফর্ম হিসাবে বিবর্তন থেকেই জন্মগ্রহণ করে। এই শর্তাদি কীভাবে তাদের বোঝায় তা বোঝার জন্য, জাভাটির নকশাকে প্রভাবিত করে এমন দুটি জিনিস সনাক্ত করা গুরুত্বপূর্ণ:
- পূর্ববর্তী সংস্করণের সাথে সামঞ্জস্যপূর্ণ. পুরানো অ্যাপ্লিকেশনগুলি নতুন ইনস্টলেশনগুলিতে চালিত হওয়া উচিত, আদর্শ ছাড়াই। এর অর্থ হল যে সমস্ত নতুন সংস্করণে একটি পুরানো এপিআই (এর নাম এবং পরিভাষা সহ) বজায় রাখা দরকার।
- ক্রস প্ল্যাটফর্ম। কোনও অপারেটিং সিস্টেম বা ব্রাউজারই হোক না কেন, API এর অন্তর্নিহিত প্ল্যাটফর্মটির ব্যবহারযোগ্য বিমূর্ততা সরবরাহ করতে হবে।
আমি ধারণাগুলি দিয়ে চলব এবং সেগুলি কীভাবে আসল। আমি তার পরে আপনার অন্যান্য, নির্দিষ্ট প্রশ্নের উত্তর দেব, কারণ আমাকে প্রথম অংশে কিছু উল্লেখ করতে হতে পারে।
"রিসোর্স" কী?
একটি বিমূর্ত, জেনেরিক ডেটার টুকরা যা অবস্থিত এবং পড়তে পারে। আলগাভাবে বলেছিলেন, জাভা এটি একটি "ফাইল" উল্লেখ করতে ব্যবহার করে যা কোনও ফাইল নাও হতে পারে তবে নামযুক্ত উপাত্তের প্রতিনিধিত্ব করে। জাভাতে এটির প্রত্যক্ষ শ্রেণি বা ইন্টারফেসের উপস্থাপনা নেই তবে এর বৈশিষ্ট্যগুলির কারণে (স্থানীয়করণযোগ্য, পঠনযোগ্য) এটি প্রায়শই কোনও ইউআরএল দ্বারা প্রতিনিধিত্ব করে।
জাভার প্রাথমিক নকশার লক্ষ্যগুলির মধ্যে একটি ব্রাউজারের ভিতরে চালানো ছিল, স্যান্ডবক্সযুক্ত অ্যাপ্লিকেশন (অ্যাপলেট!) হিসাবে খুব সীমাবদ্ধ অধিকার / সুবিধাগুলি / সুরক্ষা ছাড়পত্র, জাভা একটি ফাইলের মধ্যে একটি স্পষ্ট (তাত্ত্বিক) পার্থক্য করে (স্থানীয় কিছু ফাইল সিস্টেম) এবং একটি সংস্থান (এটি পড়ার দরকার এমন কিছু)। এ কারণেই অ্যাপ্লিকেশন সম্পর্কিত কিছু পড়া (আইকন, বর্গ ফাইল এবং আরও কিছু) ClassLoader.getResource
ফাইল শ্রেণীর মাধ্যমে করা হয় না।
দুর্ভাগ্যবশত, কারণ "রিসোর্স" একটি দরকারী জেনেরিক শব্দ বাহিরে এই ব্যাখ্যার, এটি অত্যন্ত সুনির্দিষ্ট কিছু (ক্লাস উদাঃ নাম ব্যবহার করা হয় ResourceBundle , UIResource , রিসোর্স ) যে হয় না, এই অর্থে, একটি সম্পদ।
(একটি পথ) একটি সম্পদ প্রতিনিধিত্বমূলক প্রধান ক্লাস আছে java.nio.file.Path , java.io.File , java.net.URI এবং java.net.URL ।
ফাইল (java.io, 1.0)
ফাইল এবং ডিরেক্টরি পথের নামগুলির একটি বিমূর্ত উপস্থাপনা।
ফাইল শ্রেণি এমন একটি সংস্থান প্রতিনিধিত্ব করে যা প্ল্যাটফর্মের নেটিভ ফাইল সিস্টেমের মাধ্যমে পৌঁছানো যায় । এটিতে কেবল ফাইলটির নাম রয়েছে, সুতরাং হোস্ট প্ল্যাটফর্মটি তার নিজস্ব সেটিংস, নিয়ম এবং সিনট্যাক্স অনুযায়ী ব্যাখ্যা করে এমন একটি পথ (পরে দেখুন) really
নোট করুন যে ফাইলকে স্থানীয় কিছু বোঝাতে হবে না, কেবলমাত্র এমন কিছু যা হোস্ট প্ল্যাটফর্মটি ফাইল অ্যাক্সেসের প্রসঙ্গে বোঝে যেমন উইন্ডোজের একটি ইউএনসি পথ। আপনি যদি ওএস-তে কোনও ফাইল সিস্টেম হিসাবে একটি জিপ ফাইল মাউন্ট করেন তবে ফাইলটি এতে থাকা এন্ট্রিগুলিকে ঠিকঠাক পড়বে।
ইউআরএল (java.net, 1.0)
ক্লাস ইউআরএল একটি ইউনিফর্ম রিসোর্স লোকেটারকে প্রতিনিধিত্ব করে, ওয়ার্ল্ড ওয়াইড ওয়েবে একটি "রিসোর্স" এর পয়েন্টার। একটি উত্স ফাইল বা ডিরেক্টরি হিসাবে সহজ কিছু হতে পারে, বা এটি একটি জটিল জটিল বস্তুর যেমন একটি ডেটাবেস বা অনুসন্ধান ইঞ্জিনের কোয়েরি হিসাবে উল্লেখ হতে পারে।
কোনও সংস্থার ধারণার সাথে মিল রেখে, URL শ্রেণিটি হোস্ট প্ল্যাটফর্মের কোনও ফাইলকে প্রতিনিধিত্ব করে একইভাবে সেই সংস্থানটিকে উপস্থাপন করে: একটি কাঠামোগত স্ট্রিং হিসাবে যে কোনও উত্সকে নির্দেশ করে। ইউআরএলটিতে অতিরিক্তভাবে একটি স্কিম রয়েছে যা কীভাবে সংস্থানটি পৌঁছাতে পারে তার ইঙ্গিত দেয় ("ফাইলের সাথে:" হোস্ট প্ল্যাটফর্মটি জিজ্ঞাসা করুন "), এবং তাই কোনও জারের ভিতরে এইচটিটিপি, এফটিপি, এবং হোয়াট নোটের মাধ্যমে সংস্থানগুলিকে নির্দেশ করার অনুমতি দেয় allows
দুর্ভাগ্যক্রমে, ইউআরএলগুলি "ফাইল" এবং "পাথ" এর ব্যবহার সহ তাদের নিজস্ব বাক্য গঠন এবং পরিভাষা নিয়ে আসে। ইউআরএল কোনও ফাইল-ইউআরএল হলে URL.getFile রেফারেন্সযুক্ত ফাইলের পাথ স্ট্রিংয়ের মতো একটি স্ট্রিং ফিরিয়ে দেবে।
Class.getResource
একটি ইউআরএল ফেরত দেয়: এটি ফাইল ফেরত দেওয়ার চেয়ে আরও নমনীয় এবং এটি 1990 এর দশকের গোড়ার দিকে যেমন কল্পনা করেছিল তেমনি সিস্টেমের প্রয়োজনীয়তাও সরবরাহ করেছে।
ইউআরআই (java.net, 1.4)
একটি ইউনিফর্ম রিসোর্স আইডেন্টিফায়ার (ইউআরআই) রেফারেন্স উপস্থাপন করে।
ইউআরআই ইউআরএল উপর একটি (সামান্য) বিমূর্ততা। ইউআরআই এবং ইউআরএল এর মধ্যে পার্থক্যটি ধারণাগত এবং বেশিরভাগই একাডেমিক, তবে ইউআরআই একটি প্রথাগত অর্থে আরও ভালভাবে সংজ্ঞায়িত করা হয় এবং ব্যবহারের ক্ষেত্রে বিস্তৃত পরিসীমা coversেকে দেয়। ইউআরএল এবং ইউআরআই একই জিনিস / না হওয়ায় তাদের প্রতিনিধিত্ব করার জন্য একটি নতুন শ্রেণি চালু করা হয়েছিল, যার মধ্যে ইউআর.আই.আর.আল.এল এবং ইউআরএল.টোরি এক এবং অন্যের মধ্যে যাওয়ার জন্য পদ্ধতি রয়েছে।
জাভাতে, ইউআরএল এবং ইউআরআইয়ের মধ্যে প্রধান পার্থক্যটি হ'ল কোনও ইউআরএল সমাধানযোগ্য হওয়ার প্রত্যাশাকে বহন করে , অ্যাপ্লিকেশনটি কোনও ইনপুট স্ট্রিমের কাছ থেকে চায়; একটি কোনো URI আরো একটি বিমূর্ত thingamajig যে মত চিকিত্সা করা হয় পারে কিছু সমাধানযোগ্য নির্দেশ (এবং সাধারণত আছে), কিন্তু কি এটা মানে এবং কিভাবে পৌঁছানোর এটা প্রসঙ্গ এবং ব্যাখ্যা করার জন্য আরো খোলা থাকে।
পাথ (java.nio.file, 1.7)
কোনও ফাইল সিস্টেম সিস্টেমে কোনও ফাইল সনাক্ত করতে ব্যবহৃত হতে পারে object এটি সাধারণত সিস্টেম নির্ভর ফাইল পাথের প্রতিনিধিত্ব করবে।
নতুন ইন্টারফেসে আইকনযুক্ত নতুন ফাইল এপিআই ফাইল শ্রেণীর চেয়ে আরও বেশি নমনীয়তার সুযোগ দেয়। পাথ ইন্টারফেসটি ফাইল শ্রেণীর বিমূর্ততা এবং নতুন আইও ফাইল এপিআইয়ের অংশ । হোস্ট প্ল্যাটফর্মের দ্বারা বোঝা হিসাবে ফাইলটি অগত্যা একটি "ফাইল" এ নির্দেশ করে, পথটি আরও জেনেরিক: এটি একটি স্বেচ্ছাসেবী ফাইল সিস্টেমে একটি ফাইল (সংস্থান) উপস্থাপন করে।
হোস্ট প্ল্যাটফর্মের কোনও ফাইলের ধারণার উপর নির্ভরতা কেড়ে নেয় পাথ। এটি কোনও জিপ ফাইলে একটি এন্ট্রি হতে পারে, এফটিপি বা এসএসএইচ-এফএসের মাধ্যমে অ্যাক্সেসযোগ্য একটি ফাইল, অ্যাপ্লিকেশন শ্রেণিপথের বহু-মূলের উপস্থাপনা বা ফাইলসিস্টেম ইন্টারফেস এবং এর ড্রাইভার, ফাইলসিস্টেমপ্রোভাইডার এর মাধ্যমে অর্থপূর্ণভাবে উপস্থাপিত হতে পারে এমন কোনও কিছুই। এটি একটি জাভা অ্যাপ্লিকেশন প্রসঙ্গে "মাউন্টিং" ফাইল সিস্টেমের শক্তি নিয়ে আসে।
হোস্ট প্ল্যাটফর্মটি "ডিফল্ট ফাইল সিস্টেম" এর মাধ্যমে উপস্থাপিত হয়; আপনি যখন কল করবেন তখন আপনি File.toPath
ডিফল্ট ফাইল সিস্টেমে একটি পাথ পান।
এখন, আমার কাছে যদি একটি লোকেটার থাকে যা একটি জার ফাইলটিতে কোনও শ্রেণি বা প্যাকেজটির উল্লেখ করে, তবে এই দুটি (অর্থাত কোনও ফাইলের স্ট্রিংয়ের পথটি) পৃথক হবে কি?
অসম্ভব। যদি জার ফাইলটি স্থানীয় ফাইল সিস্টেমে থাকে তবে আপনার কাছে কোনও কোয়েরি উপাদান থাকা উচিত নয়, URL.getPath
এবং URL.getFile
একই ফলাফলটি ফিরে আসা উচিত। তবে, আপনার যা প্রয়োজন তা চয়ন করুন: ফাইল-ইউআরএলগুলিতে সাধারণত কোয়েরি উপাদান নাও থাকতে পারে তবে আমি নিশ্চিত যে কোনওভাবে এটি যুক্ত করতে পারি।
শেষ অবধি - এবং সর্বাগ্রে - আমার কাছে কেন ফাইল অবজেক্টের প্রয়োজন; কেন একটি সংস্থান (ইউআরএল) যথেষ্ট নয়?
ইউআরএল পর্যাপ্ত হতে পারে না কারণ ফাইল আপনাকে গৃহকর্মী ডেটা যেমন অনুমতি (পাঠযোগ্য, লিখনযোগ্য, এক্সিকিউটেবল), ফাইলের ধরণ (আমি কি একটি ডিরেক্টরি?) এবং স্থানীয় ফাইল সিস্টেম অনুসন্ধান এবং কৌশলগুলি সন্ধান করার ক্ষমতা দেয়। এগুলি যদি আপনার প্রয়োজনীয় বৈশিষ্ট্য হয় তবে ফাইল বা পথ সেগুলি সরবরাহ করে।
পাথে অ্যাক্সেস থাকলে আপনার ফাইলের দরকার নেই। কিছু পুরানো এপিআই-তে ফাইলের প্রয়োজন হতে পারে।
(এবং কোনও উত্স অবজেক্ট আছে?)
না, নেই। এর মতো অনেকগুলি নাম রয়েছে, তবে সেগুলি অর্থে কোনও সংস্থান নয় ClassLoader.getResource
।
Path
এনআইও :) থেকে