জাভা: পাথ বনাম ফাইল


200

জাভা in-তে নতুন অ্যাপ্লিকেশনগুলির জন্য, কোনও java.io.Fileঅবজেক্টটি আর ব্যবহার করার কোনও কারণ আছে বা আমরা এটিকে অবনমিত হিসাবে বিবেচনা করতে পারি?

আমি বিশ্বাস করি একটি যা java.nio.file.Pathকরতে পারে সবকিছু java.io.Fileকরতে পারে এবং আরও অনেক কিছু।

উত্তর:


152

দীর্ঘ সংক্ষিপ্ত বিবরণ:

java.io.Fileসম্ভবত কখনও অবহেলিত / অসমর্থিত হবে না । এটি বলেছিল, java.nio.file.Pathআরও আধুনিক java.nio.fileলিবিবের একটি অংশ এবং এটি সব কিছু java.io.Fileকরতে পারে তবে সাধারণত আরও ভাল উপায়ে এবং আরও অনেক কিছু।

নতুন প্রকল্পের জন্য, ব্যবহার করুন Path

এবং যদি Fileউত্তরাধিকারের জন্য আপনার যদি কখনও কোনও অবজেক্টের প্রয়োজন হয় তবে কেবল # টু ফাইল () ফাইলকে পাথ কল করুন

ফাইল থেকে পাথে স্থানান্তরিত হচ্ছে

এই ওরাকল পৃষ্ঠাটি পার্থক্য এবং মানচিত্রগুলিকে হাইলাইট java.io.File functionalityকরেjava.nio.file lib (including Path) functionality

জেনিস জে হেইস এবং শ্যারন জাখৌরের নিবন্ধ, মে ২০০৯, জেডিকে N এ এনআইও ২.২ ফাইল সিস্টেম নিয়ে আলোচনা


12
পার্থক্য সম্পর্কে আপনি ওরাকল এর মন্তব্যগুলি এখানে পড়তে পারেন: docs.oracle.com/javase/tutorial/essential/io/legacy.html
জোশিয়ার

4
এছাড়াও মনে রাখবেন "ফাইল" (বহুবচনে) হয় না অবচিত। এটি মূলত একটি বিমূর্ত শ্রেণি যা পাথ অবজেক্টগুলিতে পরিচালনা করে এবং পুরাতন ফাইল শ্রেণীর অনেকগুলি বৈশিষ্ট্য সম্পাদন করে, যেমন
জোশিয়াহ

2
এখন আমি হতাশ করছি কেন JavaFX 8 নতুন ফাইল / FolderChooser ডায়ালগ না তারপর এখনও ব্যবহার Fileপরিবর্তে Path?
পাইগেমস

2
পাথ একটি ইন্টারফেস। একটি উদাহরণ তৈরি করতে, Paths.get (ফাইলের নাম) ব্যবহার করুন। এটি নতুন ফাইল (ফাইল নাম) .exists () এর পরিবর্তে ফাইল.এক্সিস্টগুলি (পাথস.জেট (ফাইলের নাম)) লেখার বিভ্রান্তির কারণ হতে পারে যা পুরানো এপিআই এখনও ব্যবহৃত হয়।
জোশিয়াহ যোদার

Path"বাচ্চাদের যুক্ত করতে" resolve(...)বা "এক স্তরের উপরে সরানো" getParent()ইত্যাদির সাহায্যে আরও সহজে সংশোধন করা যায় , যেখানে Fileপারে না। মূলত একবার আপনি পাথটি সংশোধন শেষ করার পরে, আপনি প্রায়শই এটিকে রূপান্তর করেন toFile()যাতে এটি কোনও FileInputStreamনির্মাণকারীর মতো উত্তরাধিকার পদ্ধতিতে প্রেরণ করা যায় ।
এইচডি

18

আমরা কি এটি অবচয় বিবেচনা করতে পারি?

না, যতক্ষণ না জাভাদোকে এটি চিহ্নিত না করা হয় আপনি এটিকে অবনমিত হিসাবে বিবেচনা করতে পারবেন নাFile


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

15
@ ক্রিস কিছুই জেডিকে থেকে সরানো হয়নি কারণ তারা 1.02-এ এডাব্লুটি ইভেন্টের মডেলটি পরিবর্তন করেছে। এটি মোটেই 'সুস্পষ্ট' নয় isn't এটা ভুল.
মারকুইস লর্ন

5
@ ডাউনভোটার্স এই উত্তরটি মূলত একটি টাউটোলজি। এটা ভুল হতে পারে না। এনবি আমি এই উত্তরটি লেখার পাঁচ বছরে জাভা 8 পরবর্তীকালে উপস্থিত হয়েছিল এবং java.io.Fileএখনও তা সরানো হয়নি এমনকি অবমূল্যায়নও করা হয়নি, এবং জাভাদোকের মধ্যে এখনও কিছু নেই যা এই প্রস্তাব দেয় যে কোনওটি ঘটবে।
মারকুইস

2
@ ইজেপি আমি আপনার মন্তব্যটি সবেমাত্র উত্সাহিত করেছি। যাইহোক, আমি পুরোপুরি নিশ্চিত নই যে আপনি যখন বলছেন উত্তরটি টাউটোলজি। যে প্রশ্নটি সম্ভবত "মতামতভিত্তিক" হওয়ার কারণে ঝুঁকিপূর্ণ হওয়া উচিত ছিল তা হ'ল "আমরা কি এটি অবচয় বিবেচনা করতে পারি "? ঠিক আছে, হ্যাঁ, ওপি এবং অন্য যে কেউ পারেন , তবে তা তা নয়।
মাইকে রডেন্ট

@ মাইক্রোডেন্ট আমি পরামর্শ দিচ্ছি যে প্রশ্নটি আসলে কী তা কেবল একটি ইচ্ছাকৃত ভুল মিথ্যা লেখা। একটি আংশিক উদ্ধৃতি।
লার্নের মারকুইস

8

আরও তথ্যের সম্পর্কে এই নিবন্ধটি দেখুন - http://www.oracle.com/technetwork/articles/javase/nio-139333.html

মূলত ফাইল.পথ এখন থেকে যাওয়ার উপায় হবে তবে বহুলাংশে পরিচিত জাভা লোকেরা ব্যাক-সামঞ্জস্য রাখার ঝোঁক রাখে তাই আমি অনুমান করি যে এ কারণেই তারা এটি ছেড়ে দিয়েছে।


আপনি দয়া করে লিঙ্কটি আপডেট করবেন? আমি এই নিবন্ধটি পড়তে চাই
জন বি

দুর্ভাগ্যক্রমে আমি ওরাকল ওয়েব পৃষ্ঠায় মূল নিবন্ধটি খুঁজে পাইনি। এখানে ওয়েবব্যাক মেশিনের একটি সংস্করণ রয়েছে: web.archive.org/web/20090601091119/http://java.sun.com/…
লর্ডডসকিয়াস

1
আমি আর্টিকেলটি আবার একটি সাধারণ ওরাকল সাইডে পেয়েছি - উত্তরের সাথে যুক্ত লিঙ্ক।
ডানকান জোন্স

5

আমি খুব ভাল উত্তর সম্পূর্ণ করব @mmcrae

java.io.File অবজেক্টটি ব্যবহার করার কি কোনও কারণ আছে বা আমরা এটিকে অবনমিত বিবেচনা করতে পারি?

জেডিকে ক্লাসগুলি খুব কমই হ্রাস করা হয়।
আপনি জেডিকে 8 এপিআই- এর প্রথম জেডিকে থেকে অবহেলিত সমস্ত শ্রেণীর তালিকাতে দেখতে পাচ্ছেন ।
এটিতে ক্লাসের সামান্য অংশ রয়েছে যা ওরাকল ডকুমেন্টেশন এবং জাভা সম্প্রদায় ব্যবহার করতে নিরুৎসাহিত করে।
java.util.Date, java.util.Vector, java.util.Hashtable... সঙ্গে এত অপূর্ণতা অবচিত নেই শ্রেণীর রয়েছে।
কিন্তু কেন ?
কারণ ধারণাগতভাবে কিছু deprecatedউপায় এখনও রয়েছে তবে এটি ব্যবহার করতে নিরুৎসাহিত করা কারণ এটি অবশ্যই মুছে ফেলা হবে।
হাজার হাজার প্রোগ্রাম এই খারাপ ডিজাইন করা ক্লাসগুলির উপর নির্ভর করে।
এই জাতীয় ক্লাসগুলির জন্য, জাভা এপিআই বিকাশকারীরা এ জাতীয় সংকেত দেবেন না।

উত্তর @EJPসত্যিই সঠিক:

যতক্ষণ না জাভাদোকে এটি চিহ্নিত থাকে until

সুতরাং, আমি মনে করি যে আপনার প্রশ্নটি এর পদগুলিতে আরও অর্থবোধ করবে:
"আমাদের পছন্দ অনুসারে, আমাদের কী ব্যবহার করা উচিত java.io.Fileবা java.nio.file.Pathনতুন উন্নয়নের জন্য এবং যদি উত্তর হয় java.nio.file.Path, আপনি কি সহজেই java.io.Fileউত্তরাধিকার প্রকল্পগুলি ব্যবহার করে সুবিধা নিতে পারবেন java.io.File?"

আমি বিশ্বাস করি একটি java.nio.file.Path java.io.File এবং আরও অনেক কিছু করতে পারে everything

আপনার কাছে উত্তর আছে।

উত্তরাধিকার আইও সম্পর্কে এই ওরাকল টিউটোরিয়ালটি আপনার চিন্তাকে নিশ্চিত করে।

জাভা এসই 7 রিলিজের আগে, java.io.Fileক্লাসটি I / O ফাইলের জন্য ব্যবহৃত মেকানিজম ছিল, তবে এতে বেশ কিছু ত্রুটি ছিল।

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

পুনর্নামকরণের পদ্ধতিটি প্ল্যাটফর্মগুলির জুড়ে ধারাবাহিকভাবে কাজ করে না। প্রতীকী লিঙ্কগুলির জন্য সত্যিকারের সমর্থন ছিল না।

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

ফাইল মেটাডেটা অ্যাক্সেস অকার্যকর ছিল।

অনেক ফাইল পদ্ধতি স্কেল করেনি। একটি সার্ভারের উপরে একটি বৃহত্তর ডিরেক্টরি তালিকার অনুরোধের ফলে হ্যাং হতে পারে। বড় ডিরেক্টরিগুলি মেমরি রিসোর্সের সমস্যাও সৃষ্টি করতে পারে, যার ফলে পরিষেবাটি অস্বীকার করা যায়।

নির্ভরযোগ্য কোড লেখা সম্ভব ছিল না যা বৃত্তাকার প্রতীকী লিঙ্কগুলি থাকলে পুনরাবৃত্তভাবে একটি ফাইল ট্রি হাঁটতে এবং যথাযথ প্রতিক্রিয়া জানাতে পারে।

এতগুলি ত্রুটিগুলির সাথে java.io.File, আমাদের নতুন বিকাশের জন্য এই শ্রেণিটি ব্যবহার করার সত্যিই কোনও কারণ প্রয়োজন নেই।
এমনকি লিগ্যাসি কোড ব্যবহারের জন্যও java.io.Fileওরাকল ব্যবহারের জন্য ইঙ্গিত দেয় Path

সম্ভবত আপনার কাছে লিগ্যাসি কোড রয়েছে যা java.io.File ব্যবহার করে এবং আপনার কোডটিতে নূন্যতম প্রভাব সহ java.nio.file.Path কার্যকারিতাটি গ্রহণ করতে চান।

Java.io.File ক্লাসটি toPath পদ্ধতি সরবরাহ করে, যা একটি পুরানো শৈলীর ফাইল উদাহরণটিকে java.nio.file.Path দৃষ্টান্তে রূপান্তর করে:

Path input = file.toPath();

এরপরে আপনি পাঠ ক্লাসে উপলব্ধ সমৃদ্ধ বৈশিষ্ট্য সেটটির সুবিধা নিতে পারেন।

উদাহরণস্বরূপ, ধরুন আপনার কাছে এমন কিছু কোড রয়েছে যা একটি ফাইল মুছে ফেলেছে:

file.delete();

ফাইলস.ডিলেট পদ্ধতিটি ব্যবহার করতে আপনি এই কোডটি পরিবর্তন করতে পারেন, নিম্নরূপ:

Path fp = file.toPath();
Files.delete(fp);

সংক্ষেপে, সে / সে চাইলে অবশ্যই এটিকে অবমূল্যায়িত বিবেচনা করতে পারে।
মাইকে রডেন্ট

পছন্দ করুন যথাযথভাবে। ধারণামূলকভাবে তার / তার উচিত যখন জাভাডোকের ক্ষেত্রে এটি কারণ হিসাবে ব্যাখ্যাযোগ্য কারণে না হয়।
ডেভিডএক্সএক্সএক্সএক্স

4

হ্যাঁ, তবে জাভা's এর নিজস্ব স্ট্যান্ডার্ড এপিআই সহ অনেকগুলি বিদ্যমান এপিআই এখনও কেবল Fileপ্রকারের সাথে কাজ করে ।


8
Path.toFile () ব্যবহার করে পাথ অবজেক্টগুলিকে ফাইল অবজেক্টে রূপান্তর করা যায় , তারপরে স্ট্যান্ডার্ড এপিআইগুলি ব্যবহার করুন।
জ্যাকট্রেডস

2
তাহলে আপনার উত্তরটি 'হ্যাঁ তবে না'?
লার্নের মার্কুইস

1

জাভা.ও.ফাইলে হ্রাস করা হয় না। হ্যাঁ java.nio.file.Path আরও ভাল, তবে যতক্ষণ পর্যন্ত জাভা.আইও.ফায়াল ব্যবহার করে প্রচুর প্রোগ্রাম এবং পাঠ্য বই রয়েছে, কেবলমাত্র উত্তরাধিকারগত কারণে যদি এটি অবহেলিত বিবেচনা করা না হয় তবে এটি অত্যন্ত গুরুত্বপূর্ণ। এটি করা হ'ল কেবল কোনও লাভের জন্য কাজগুলিতে একটি স্প্যানার নিক্ষেপ করা। উদাহরণস্বরূপ অ্যান্ড্রয়েড ফ্রেমওয়ার্কটি তার কয়েকটি বেসিক ফাইল হ্যান্ডলিং বৈশিষ্ট্যগুলির জন্য ফাইল ব্যবহার করে, অন্যান্য অনেকগুলি কাজ।


তিনি জিজ্ঞাসা করেননি Pathআরও ভাল কিনা । তিনি জিজ্ঞাসা করলেন Fileঅবনতি হয়েছে কিনা ।
লার্নের মারকুইস

1
@ জেজেপি আমার মনে হয় আপনি পেডেন্টিকের চেয়ে একটু বেশি হয়ে যাচ্ছেন। ওপা java.io.File অবমূল্যায়ন করা হয়েছে কিনা জিজ্ঞাসা করেছিল এবং আমি উত্তর দিয়েছিলাম .. তিনি আরও বলেছিলেন "আমি বিশ্বাস করি java.nio.file.Path java.io.File এবং আরও কিছু করতে পারে সবকিছু করতে পারে।" আমি নিছক তাঁর মন্তব্যে নিশ্চিত হয়ে যাচ্ছিলাম, এটি খুব কমই ভোটের চেয়ে কম ছিল।
অ্যান্ড্রু এস

-9

জাভা in-তে নতুন অ্যাপ্লিকেশনগুলির জন্য, জাভা.ইও.ফাইয়েল অবজেক্টটি ব্যবহার করার কোনও কারণ আছে কি আমরা এটিকে অবচয় বলে বিবেচনা করতে পারি?

এটি কিছুটা বলার মতো: "নেপোলিয়ন কি রাশিয়া আক্রমণ করবে, নাকি এই ব্রাসেলস স্প্রাউটগুলি আসলেই সুস্বাদু?"

প্রশ্নের দ্বিতীয় অংশ হিসাবে, আপনি সত্যই এটিকে অবমূল্যায়িত বিবেচনা করতে পারেন। 2018 এর জানুয়ারী হিসাবে, এটি অবচয় করা হয়নি। তবে আপনাকে এটি বিবেচনা করে থামার কিছু নেই । এটি আপনার জীবনে কোনও লাভ অর্জন করবে বা পরেরটি বলা অসম্ভব।


5
আমি আপনার উপমা বুঝতে পারি না।
তুনাকি

যে কোনও "বা" প্রশ্নে দুটি যৌক্তিক বিকল্প উপস্থিত করা উচিত, উভয়ই একই প্রশ্নের মূলত উত্তর দেয়।
মাইকে রডেন্ট

দুঃখিত, এটি এই প্রসঙ্গে উচ্চ পেডেন্টিক শোনায়। ধারণাটি "আমি ব্যবহার করতে চাই FileI আমি, হ্যাঁ বা না"?
টুনাকি

1
হ্যাঁ আমি সম্মতি জানাই এটি একটি বোঝা প্রশ্ন ... বিশেষত যেহেতু প্রচুর বিদ্যমান 3 য় পক্ষের এপিআই এখনও এখনও ব্যবহার করে File। এটি খুব শীঘ্রই আর মারা যাবে না।
টুনাকি

3
it isn't deprecated. But there's nothing to stop you *considering* it soহাঃ হাঃ হাঃ.
ডন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.