ফাইল.স্যাপারেটর এবং পাথগুলিতে স্ল্যাশের মধ্যে পার্থক্য


200

জাভা পাথ-স্ট্রিংয়ের ব্যবহার File.separatorএবং সাধারণের /মধ্যে পার্থক্য কী ?

ডাবল ব্যাকস্ল্যাশ \\প্ল্যাটফর্মের বিপরীতে স্বাধীনতার কারণ হিসাবে মনে হচ্ছে না, কারণ উভয় সংস্করণ উইন্ডোজ এবং ইউনিক্সের অধীনে কাজ করে work

public class SlashTest {
    @Test
    public void slash() throws Exception {
        File file = new File("src/trials/SlashTest.java");
        assertThat(file.exists(), is(true));
    }

    @Test
    public void separator() throws Exception {
        File file = new File("src" + File.separator + "trials" + File.separator + "SlashTest.java");
        assertThat(file.exists(), is(true));
    }
}

প্রশ্নটির পুনঃব্যবহারের জন্য, যদি /ইউনিক্স এবং উইন্ডোতে কাজ করে তবে কেন কখনও ব্যবহার করা উচিত File.separator?


5
@ রিং 'reasonsতিহাসিক কারণ' এর মতো কী?
লার্নের মারকুইস

উত্তর:


245

ফাইলগুলির সাথে ডিল করার জন্য জাভা লাইব্রেরির সাহায্যে আপনি নিরাপদে /সমস্ত প্ল্যাটফর্মে (স্ল্যাশ, ব্যাকস্ল্যাশ নয়) ব্যবহার করতে পারেন । লাইব্রেরি কোড অভ্যন্তরীণভাবে প্ল্যাটফর্ম-নির্দিষ্ট পথে জিনিসগুলিকে অনুবাদ করে পরিচালনা করে।

তবে আপনি File.separatorইউআই- তে ব্যবহার করতে চাইতে পারেন কারণ জাভা কী বোঝায় তার চেয়ে বেশি লোককে তাদের ওএসে কী বোঝায় তা প্রদর্শন করা ভাল best

আপডেট : "আপনি সর্বদা একটি স্ল্যাশ ব্যবহার করতে পারেন" আচরণ নথিভুক্ত, সন্ধানের পাঁচ মিনিটের মধ্যে আমি সক্ষম হতে পারিনি। এখন, আমি নিশ্চিত যে আমি এটি নথিভুক্ত দেখেছি, তবে একটি সরকারী রেফারেন্স খুঁজে পাওয়ার অনুপস্থিতিতে (কারণ আমার স্মৃতিশক্তি নিখুঁত নয়), আমি ব্যবহারের সাথে থাকব File.separatorকারণ আপনি জানেন যে এটি কার্যকর হবে।


2
এটি পারফরম্যান্সেও সমস্যা হতে পারে, যেহেতু আপনি রানটাইমের সময় বিভাজককে অন্য কোনও কিছুতে রূপান্তরিত করার প্রত্যাশা করছেন। এছাড়াও, অসমর্থিত সমস্ত জেভিএমের বাইরে এটি ঘটবে বলে আশা করবেন না।
jpabluz

7
@ টিজে ক্রাউডার: "আপনি সর্বদা স্ল্যাশ ব্যবহার করতে পারেন" আচরণের নথিভুক্ত থাকা সন্ধানের পাঁচ মিনিটের মধ্যে আমি সক্ষম হতে পারিনি। " এটি জেভিএমের বৈশিষ্ট্য নয়, এটি উইন্ডোজ এনটি এপিআইয়ের একটি বৈশিষ্ট্য।
পাওয়ারলর্ড

12
@ পাওয়ারওয়ার্ড: উইন্ডোজ যদি এটিও করে তবে দুর্দান্ত - তবে গ্রন্থাগারটি (জেভিএম নয়) এটিও করে। বিশেষত, সর্বজনীন API- এর মাধ্যমে প্রাপ্ত পাথগুলিকে "স্বাভাবিককরণ" করতে সমস্ত জায়গার Fileব্যবহার FileSystem.normalizeকরে এবং প্রায় কোনও কিছু যা ফাইল পথের স্ট্রিংগুলির সাথে সম্পর্কিত হয় (উদাহরণস্বরূপ, FileWriter(String)) Fileকভারগুলির নীচে ব্যবহার করে।
টিজে ক্রাউডার

9
জাভা 7 এর পরে আর ফাইল.স্যাপারেটর ব্যবহার করার দরকার নেই। দির থেকে দির এবং ফাইল নাম যোগ করার জন্য ডায়ার করার জন্য java.nio.file.Paths (Paths.get (প্রথম, আরও ...)) ব্যবহার করা অনেক সহজ এবং ক্লিনার।
ম্যাজিক্রাফটার

6
@ জাপাবলুজ 'পারফরম্যান্সে সমস্যা'! আপনি গুরুতর? ব্যবহারকারীর ফাইলনামগুলি ডিস্কে রেখে দেওয়া বিবেচনা করে, কোনও অনুবাদের রানটাইম প্রভাব একেবারেই তুচ্ছ। এটা কোন JVM দ্বারা সমর্থিত হবে যেমন স্পেসিফিকেশন অংশ File
লার্নের মারকুইস

316

তুমি ব্যাবহার কর File.separator কারণ কোনও দিন আপনার প্রোগ্রামটি দূরের কোনও স্থানে উন্নত প্ল্যাটফর্মে চলতে পারে, অদ্ভুত জিনিস এবং অপরিচিত লোকদের দেশ, যেখানে ঘোড়াগুলি কাঁদে এবং গরু সমস্ত লিফট পরিচালনা করে। এই দেশে লোকেরা traditionতিহ্যগতভাবে ":" চরিত্রটিকে ফাইল বিভাজক হিসাবে ব্যবহার করেছে এবং তাই যথাযথভাবে জেভিএম তাদের ইচ্ছাকে মান্য করে।


4
হ্যাঁ, পয়েন্টি সত্যিই আমাদের এল্বোনিয়ায় ফেলেছে (আশা করি তার কোনও চুল কাটা নেই ;-) (অভ্যন্তরে গিক
পাং

4
"... এবং গরু সমস্ত লিফট পরিচালনা করে।" ঠিক সেই সাথে আমি যখন পড়ি তখন আমার কফির একটি চুমুক নিচ্ছিলাম না। উজ্জ্বল।
টিজে ক্রোডার

8
এই জাতীয় দেশে আপনি নতুন org.apache.chicken.elevators.OperatorUटिलिटी ক্লাস ব্যবহার করবেন, এটি আপনার সুবিধার জন্য এই সমস্ত উন্মাদাকে এম্বেড করে।
ব্রেইন

27

রেফারেন্স একটি ফাইলের নাম Overkill (যারা জমি বন্ধ পর্যন্ত কল্পনা জন্য, আমি কল্পনা তাদের জেভিএম বাস্তবায়ন একটি প্রতিস্থাপন করবে File.separator ব্যবহার যদিও /একটি সঙ্গে: মাত্র জানালা JVM প্রতিস্থাপন এটি একটি মতো \)।

যাইহোক, কখনও কখনও আপনি ফাইলটি রেফারেন্স পেয়ে যাচ্ছেন, এটি তৈরি করছেন না এবং আপনার এটি বিশ্লেষণ করতে হবে এবং এটি করতে সক্ষম হতে আপনাকে প্ল্যাটফর্মের বিভাজকটি জানতে হবে। File.separator আপনাকে এটি করতে সহায়তা করে।


11

ঠিক আছে কিছু কোড পরিদর্শন করা যাক।
File.javaলাইন 428 থেকে 435 এ File.<init>:

String p = uri.getPath();
if (p.equals(""))
    throw new IllegalArgumentException("URI path component is empty");

// Okay, now initialize
p = fs.fromURIPath(p);
if (File.separatorChar != '/')
p = p.replace('/', File.separatorChar);

এবং আসুন fs/*(FileSystem)*/.fromURIPath()দস্তাবেজগুলি পড়ুন:

java.io.FileSystem
পাবলিক অ্যাবস্ট্রাক্ট স্ট্রিং from ইউরিপাথ (স্ট্রিং পাথ)
প্রয়োজনে প্রদত্ত ইউআরআই পাথ স্ট্রিং পোস্ট-প্রক্রিয়া করুন। এটি win32 এ ব্যবহৃত হয়, যেমন, "/ c: / foo" কে "c: / foo" এ রূপান্তর করতে। পাথ স্ট্রিংটিতে এখনও স্ল্যাশ বিভাজক রয়েছে; ফাইল ক্লাসের কোডগুলি এই পদ্ধতিটি ফেরার পরে তাদের অনুবাদ করবে।

এর অর্থ FileSystem.fromURIPath()কেবল উইন্ডোতে ইউআরআই পথে পোস্ট প্রসেসিং হয় এবং পরবর্তী লাইনে:

p = p.replace('/', File.separatorChar);

এটি প্রতিটি '/' কে সিস্টেম নির্ভর করে প্রতিস্থাপন করে seperatorChar, আপনি সর্বদা নিশ্চিত হতে পারবেন যে প্রতিটি ওএসে '/' নিরাপদ ।


8

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


এই ওএসগুলির বেশিরভাগই ইউনিক্সের কিছু বৈকল্পিক। পুরানো ম্যাক শৈলীর :বিভাজনকারীরা দীর্ঘকাল চলে গেছে। দেখে মনে হয় উইন্ডোজ ছাড়া সবাই স্ট্যান্ডার্ডটি ব্যবহার করে /। এমনকি উইন্ডোজগুলিও এখন স্ল্যাশগুলি ভালভাবে পরিচালনা করছে handle cd /windows/systemআপনার মূল সিস্টেম ড্রাইভ থেকে একটি উইন্ডোজ 10 সিস্টেমে চেষ্টা করুন। আপনি এখনও সিস্টেম বিভাজক ব্যবহার করে পাথ প্রদর্শন করতে চান (যাতে আপনার ব্যবহারকারীদের বিভ্রান্ত না করে) আপনি /অন্য যে কোনও জায়গায় ফরোয়ার্ড-স্ল্যাশ ব্যবহার করতে পারেন এবং আত্মবিশ্বাসের সাথে বিশ্বাস রাখতে পারেন যে আপনার কোডটি যে কোনও জায়গায় এটি ব্যবহারের সম্ভাবনা রয়েছে work
শ্যাডো ম্যান

7

যদিও এটি আসার পথে খুব বেশি পার্থক্য করে না, এটি ফেরার পথে ঘটে।

অবশ্যই আপনি নতুন ফাইলের ('স্ট্রিং পাথ)' / 'বা' \ 'ব্যবহার করতে পারেন তবে ফাইল.গেটপথ () কেবলমাত্র তাদের মধ্যে একটি আপনাকে দেবে।


সামান্য সংশোধন ... উইন্ডোজ আপনি সামনের /দিকে বা পিছনে \\ স্ল্যাশ ব্যবহার করতে পারেন । তবে অন্য কোথাও, আপনি ভাল ফরোয়ার্ড স্ল্যাশ ব্যবহার করছেন /বা আপনার সমস্যা আছে।
শেডো ম্যান

6

পার্টিতে লে। আমি জেডিকে ১.৮ এবং এক্সলিপস মার্স ১ নিয়ে উইন্ডোজ 10 এ আছি
I

getClass().getClassLoader().getResourceAsStream("path/to/resource");

কাজ করে এবং

getClass().getClassLoader().getResourceAsStream("path"+File.separator+"to"+File.separator+"resource");

কাজ করে না এবং

getClass().getClassLoader().getResourceAsStream("path\to\resource");

কাজ করে না. শেষ দুটি সমতুল্য। সুতরাং ... আমার কাছে ফাইল.সেস্পেটর ব্যবহার না করার উপযুক্ত কারণ রয়েছে।


6
এই লাইনে getClass().getClassLoader().getResourceAsStream("path\to\resource");একটি সারণী ( \t) এবং একটি ক্যারেজ রিটার্ন ( \r) রয়েছে।
স্টিফান

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

@ স্টেফান সেখানে কোনও মজাদার পালানোর উপায় নেই, যেহেতু File.separatorব্যাকস্ল্যাশ। এটি কেবল কঠোর কোডিং স্ট্রিংগুলিতে যেখানে এটি একটি পালানোর চরিত্র হিসাবে বিবেচিত হবে যেখানে আপনাকে ব্যাকস্ল্যাশ থেকে বাঁচতে হবে। আপনি যদি অক্ষরটি কোনও পাঠ্য ফাইলে সংরক্ষণ করেছেন বা একটি charবা Stringতারপরে আপনার দ্বিতীয়বারের মতো এড়াতে হবে না কারণ এটি ইতিমধ্যে প্রত্যাশিত ব্যাকস্ল্যাশ অক্ষরে রূপান্তরিত হয়েছে। নিজের জন্য এটি দেখার চেষ্টা করুন:String backslash = "\\"; System.out.println("welcome" + backslash + "to" + backslash + "reality");
শেডো ম্যান

2
@ স্টেফান ওহ, আমি দেখছি ... আপনি তৃতীয় লাইনের কথা বলছিলেন আপনি সঠিক. সেই লাইনে (একটি হার্ড-কোডিং স্ট্রিং) আপনার পালানোর চরিত্রটি পালাতে হবে। আমার চোখ ২ য় লাইনে এসে থামল এবং আমি প্রথম তৃতীয় লাইনের দিকেও লক্ষ্য করিনি।
শেডো ম্যান

3

বহনযোগ্য সরল এবং সহজ।


হ্যাঁ, বহনযোগ্যতার জন্য, ব্যাকস্ল্যাশ ব্যবহার করবেন না । ফরোয়ার্ড স্ল্যাশ /বা সিস্টেম বিভাজক ব্যবহার করুন File.separator। এই দু'জনেই সব জায়গায় কাজ করে বলে মনে হচ্ছে। যদিও File.separatorসর্বত্র কাজ নিশ্চিত করা হয়, সহজ স্ল্যাশ /এছাড়াও সব জায়গায় কাজ বলে মনে হয়। যদি এটি কোথাও কাজ করে না, তবে আমি এটি সম্পর্কে শুনতে পছন্দ করব। আমি বিশ্বাস করি এটি সমস্ত সিস্টেমে কাজ করবে। খুব কমপক্ষে, আমি এখনও এমন কোনও জায়গা খুঁজে পেয়েছি যা /কাজ করে না (ম্যাক ওএসএক্স, উইন্ডোজ, * নিক্স, অ্যান্ড্রয়েড, আইওএস - আমি ওএসএক্স ম্যাকগুলি প্রাক: বিভাজনকারী হিসাবে ":" ব্যবহার করেছিলাম না, যদিও ওএস / 2, NeXT, বা অন্যান্য সত্যিকারের প্রাচীন ওএসগুলির কোনও)।
শ্যাডো ম্যান

1

"প্রোগ্রামারদের জন্য জাভা এসই 8" দাবি করে যে জাভা উভয়ই মোকাবেলা করবে। (পৃষ্ঠা 480, শেষ অনুচ্ছেদ)। উদাহরণ দাবি করে যে:

c:\Program Files\Java\jdk1.6.0_11\demo/jfc

ঠিক ঠিক পার্স করা হবে। সর্বশেষ (ইউনিক্স-স্টাইল) বিভাজকের নোট নিন।

এটি কৃপণ, এবং সম্ভবত ত্রুটি-প্রবণ, তবে এটিই তারা (ডিজিটাল এবং ডাইটেল) দাবি করে।

আমি মনে করি জাভা না হয়ে মানুষের জন্য বিভ্রান্তি এই (ভুল?) বৈশিষ্ট্যটি ব্যবহার না করার পক্ষে যথেষ্ট কারণ।


1

ভদ্রলোক বৈকল্পিক বিশদ সহ পার্থক্য বর্ণনা করেছেন।

একাধিক ওএসে মোতায়েনের সম্ভাবনা নিয়ে কোনও প্রোগ্রামে ফাইলগুলি পরিচালনা করার সময় আমি অ্যাপাচি কমন্স আইও এপিআই, শ্রেণীর ব্যবহারের পরামর্শ দিতে চাই FilenameUtils


0

হোস্ট সিস্টেমের নামকরণের কনভেনশনগুলি ব্যবহার করে কোনও ফাইল বা ডিরেক্টরিটির পাথের নাম নির্দিষ্ট করা হয়। তবে ফাইল শ্রেণি প্ল্যাটফর্ম-নির্ভর ধ্রুবকগুলি সংজ্ঞায়িত করে যা প্ল্যাটফর্ম-স্বতন্ত্র উপায়ে ফাইল এবং ডিরেক্টরি নাম পরিচালনা করতে ব্যবহার করা যেতে পারে।

ফাইলস.সেপ্রেটর এমন একটি অক্ষর বা স্ট্রিংকে সংজ্ঞায়িত করে যা ডিরেক্টরি এবং ফাইলের অংশগুলিকে একটি পাথের নামগুলিতে পৃথক করে। এই বিভাজকটি যথাক্রমে ইউনিক্স, উইন্ডোজ এবং ম্যাকিনটোসের জন্য '/', '\' বা ':'।


ম্যাকিনটোসের জন্য ":" প্রাচীন। ওএসএক্সের ফলে ম্যাক "/" (ফরোয়ার্ড স্ল্যাশ) ব্যবহার করে যেহেতু এটি হুডের অধীনে মানক ইউএনআইএক্স ফাইল সিস্টেমের সাথে ইউএনআইএক্স-এর একটি রূপ চলছে।
শেডো ম্যান


0

ফাইল.স্যাপারেটর ব্যবহার করে উবুন্টু ডিরেক্টরিগুলির পরিবর্তে এর নামে "\" দিয়ে ফাইল তৈরি করে। সম্ভবত আমি কীভাবে ফাইলগুলি (এবং ডিরেক্টরিগুলি) তৈরি করছি তাতে অলসতা বোধ করছি এবং তা এড়ানো যেত, নির্বিশেষে, "/" এর নামের সাথে "" "দিয়ে ফাইলগুলি এড়াতে প্রতিবার ব্যবহার করতে পারি


0

আপনি যদি লিনাক্স বিভাজক ব্যবহার করে কিছু প্রস্তুত পথ (উদাহরণস্বরূপ ডাটাবেসে সংরক্ষণ করা) থেকে একটি ফাইল তৈরি করার চেষ্টা করছেন, তবে আমার কী করা উচিত?

ফাইলটি তৈরি করতে পারে এমন পথ ব্যবহার করুন:

new File("/shared/folder/file.jpg");

তবে উইন্ডোজ একটি আলাদা বিভাজক ( \) ব্যবহার করে । সুতরাং, বিকল্প কি স্ল্যাশ বিভাজককে প্ল্যাটফর্মে স্বাধীন রূপান্তর করতে পারে? ভালো লেগেছে:

new File(convertPathToPlatformIndependent("/shared/folder"));

এই পদ্ধতিতে convertPathToPlatformIndependentসম্ভবত "/" দ্বারা কোনও ধরণের বিভাজন হবে এবং ফাইল.স্যাপারেটরের সাথে যুক্ত হবে।

ভাল, আমার জন্য, এটি প্ল্যাটফর্ম স্বাধীন (ডান?) এবং জাভা ইতিমধ্যে উইন্ডোজ বা লিনাক্সের ব্যবহারকে সমর্থন করে এমন কোনও ভাষার পক্ষে ভাল নয়/ । তবে আপনি যদি পথের সাথে কাজ করছেন এবং প্রতিবার একবার এই রূপান্তরটি মনে রাখার দরকার পড়ে এটি দুঃস্বপ্ন হয়ে যায় এবং ভবিষ্যতে অ্যাপ্লিকেশনটির জন্য আপনার কোনও সত্যিকারের লাভ হবে না (সম্ভবত বিশ্বব্যাপী যা @ পয়েন্ট বর্ণনা করেছেন)।

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