জাভা পথে যোগ দেওয়া


100

ইন Pythonআমি দু পাথ যোগ দিতে পারেন os.path.join:

os.path.join("foo", "bar") # => "foo/bar"

আমি জাভা একই পটে যাবেন যদি চেষ্টা করছি, উদ্বেজক ছাড়া OSহয় Unix, Solarisবা Windows:

public static void main(String[] args) {
    Path currentRelativePath = Paths.get("");
    String current_dir = currentRelativePath.toAbsolutePath().toString();
    String filename = "data/foo.txt";
    Path filepath = currentRelativePath.resolve(filename);

    // "data/foo.txt"
    System.out.println(filepath);

}

আমি আশা Path.resolve( )করছিলাম /home/user/testযা data/foo.txtতৈরির সাথে আমার বর্তমান ডিরেক্টরিতে যোগ দেবে /home/user/test/data/foo.txt। আমার কী ভুল হচ্ছে?


4
এটি এমন কিছু হতে পারে যা আমি দেখছি না। আপনার বর্তমান পথ ""। আপনার দ্বিতীয় পথটি "ডেটা / foo.txt"। হতে পারে আপনার সমস্যাটি মনে হচ্ছে আপনি কোনও প্যাথ অবজেক্টটি প্রিন্ট করছেনfilepath.toString()
সিজেডিএস

4
ব্যবহারnew File(parent, child)
saka1029

উত্তর:


103

যদিও empty Stringকাজটি ব্যবহার করে বর্তমান ডিরেক্টরি পাওয়ার মূল সমাধান । তবে user.dirবর্তমান ডিরেক্টরি এবং user.homeহোম ডিরেক্টরিতে সম্পত্তি ব্যবহার করার পরামর্শ দেওয়া হচ্ছে ।

Path currentPath = Paths.get(System.getProperty("user.dir"));
Path filePath = Paths.get(currentPath.toString(), "data", "foo.txt");
System.out.println(filePath.toString());

আউটপুট:

/Users/user/coding/data/foo.txt

জাভা পাথ ক্লাস ডকুমেন্টেশন থেকে:

কোনও পাথকে খালি পথ হিসাবে বিবেচনা করা হয় যদি এটিতে কেবলমাত্র একটি নাম উপাদান থাকে emptyempty path is equivalent to accessing the default directoryফাইল সিস্টেমের একটি ব্যবহার করে একটি ফাইল অ্যাক্সেস করা ।


কেন Paths.get("").toAbsolutePath()কাজ করে

যখন একটি খালি স্ট্রিংটি পাস করা হয় Paths.get(""), প্রত্যাবর্তিত Pathঅবজেক্টে ফাঁকা পথ থাকে। তবে আমরা যখন কল করি তখন Path.toAbsolutePath()এটি পথের দৈর্ঘ্য শূন্যের চেয়ে বেশি কিনা তা পরীক্ষা করে, অন্যথায় এটি user.dirসিস্টেমের সম্পত্তি ব্যবহার করে এবং বর্তমান পথটি ফেরত দেয়।

এখানে ইউনিক্স ফাইল সিস্টেম বাস্তবায়নের কোড হল: UnixPath.toAbsolutePath ()


মূলত আপনি Pathবর্তমান ডিরেক্টরি পাথটি সমাধান করার পরে আপনাকে পুনরায় ইনস্ট্যান্স তৈরি করতে হবে।

এছাড়াও আমি File.separatorCharপ্ল্যাটফর্মের স্বাধীন কোডের জন্য ব্যবহার করার পরামর্শ দেব ।

Path currentRelativePath = Paths.get("");
Path currentDir = currentRelativePath.toAbsolutePath(); // <-- Get the Path and use resolve on it.
String filename = "data" + File.separatorChar + "foo.txt";
Path filepath = currentDir.resolve(filename);

// "data/foo.txt"
System.out.println(filepath);

আউটপুট:

/Users/user/coding/data/foo.txt

আমি না, হয়তো কেউ স্ট্রিংয়ের উপর কাজ করে এবং separatorCharকিছুটা "উচ্চ স্তরের বিমূর্তি" থেকে নিকৃষ্ট, এমন দেখতে দেখতে কিছুটাPathBuilder(currentRelativePath).append("data").append("foo.txt")
jingyu9575

23

Paths#get(String first, String... more) বলে,

পাথ স্ট্রিং, বা স্ট্রিংগুলির একটি ক্রম যা পাথ স্ট্রিং গঠনে যোগদানের পরে একটিতে রূপান্তর করে Path

...

একটি Pathএকটি প্রতিনিধিত্বমূলক খালি যদি প্রথম খালি স্ট্রিং এবং আরো কোনো খালি নয় এমন স্ট্রিং ধারণ করে না পথ ফিরিয়ে দেওয়া হয়।

বর্তমান ব্যবহারকারী ডিরেক্টরি পেতে আপনি সহজেই ব্যবহার করতে পারেন System.getProperty("user.dir")

Path path = Paths.get(System.getProperty("user.dir"), "abc.txt");
System.out.println(path);

অধিকন্তু, getপদ্ধতি ব্যবহার পরিবর্তনশীল দৈর্ঘ্য যুক্তি এর Stringযা পরবর্তী পথ স্ট্রিং প্রদান ব্যবহার করা হবে। সুতরাং, আপনার তৈরি Pathকরতে /test/inside/abc.txtআপনাকে এটি নিম্নলিখিত উপায়ে ব্যবহার করতে হবে,

Path path = Paths.get("/test", "inside", "abc.txt");

9

নির্দিষ্ট পদ্ধতি নয়।

আপনি যদি জাভা 8 বা আরও ভাল ব্যবহার করেন তবে আপনার কাছে 2 টি বিকল্প রয়েছে:

ক) java.util.StringJoiner ব্যবহার করুন

StringJoiner joiner = new StringJoiner(File.pathSeparator); //Separator
joiner.add("path1").add("path2");
String joinedString = joiner.toString();

খ) ব্যবহার করুন String.join(File.pathSeparator, "path1", "path2");

আপনি যদি জাভা 7 বা তার চেয়ে কম ব্যবহার করেন তবে আপনি অ্যাপাচি কমন্স থেকে কমন্স-ল্যাং লাইব্রেরি ব্যবহার করতে পারেন। ক্লাস স্ট্রিংগিলসের একটি বিভাজক ব্যবহার করে স্ট্রিংগুলিতে যোগদানের একটি পদ্ধতি রয়েছে।

গ) StringUtils.join(new Object[] {"path1", "path2"}, File.pathSeparator);

একটি সাইডনোট: আপনি উইন্ডোজের জন্য লিনাক্স প্যাথসেপারেটর "/" ব্যবহার করতে পারেন (কেবল মনে রাখবেন পরম পাথগুলি "/ C: / mydir1 / mydir2" এর মতো কিছু। আপনি যদি ফাইল: // এর মতো প্রোটোকল ব্যবহার করেন তবে সর্বদা "/" ব্যবহার করা খুব কার্যকর


স্ট্রিংজাইনার আমাকে ফিরিয়ে দিয়েছেন/home/user/test:foo.txt
সাইবারটেক্সট্রন

আপনি যে বিকল্পগুলি জানেন সেগুলি কেবলমাত্র অস্তিত্ব নয়। উদাহরণস্বরূপ, কেউ জোড়ার পরিবর্তে স্ট্রিংবিল্ডার ব্যবহার করতে পারে। এবং প্রকৃতপক্ষে, ফাইল / পাথের চেয়ে স্ট্রিংয়ের উপর ভিত্তি করে আপনার বাস্তবায়ন বেশ নির্বোধ এবং অনেক পরিস্থিতিতে সমস্যার কারণ হতে পারে।
XenoRo

4
File.separatorপরিবর্তে আমার জন্য কাজ করেছেনFile.pathSeparator
ইভান সিরোকি

।। ব্যবহার Pathes.get ( "path1", "path2") toAbsolutePath () toString ()
Erdinc Ay,

6

সর্বাধিক প্রাথমিক উপায়:

Path filepath = Paths.get("foo", "bar");

আপনার কখনই লেখা উচিত নয় Paths.get("")। আমি আশ্চর্য যে এ কাজ করে। আপনি যদি বর্তমান ডিরেক্টরিটি স্পষ্টভাবে উল্লেখ করতে চান তবে ব্যবহার করুন Paths.get(System.getProperty("user.dir"))। আপনি যদি ব্যবহারকারীর হোম ডিরেক্টরি চান তবে ব্যবহার করুন Paths.get(System.getProperty("user.home"))

আপনি পদ্ধতির সমন্বয় করতে পারেন:

Path filepath = Paths.get(
    System.getProperty("user.home"), "data", "foo.txt");

1

জাভাতে পাথগুলিতে যোগ দেওয়ার সবচেয়ে নির্ভরযোগ্য, প্ল্যাটফর্ম-স্বতন্ত্র উপায় হ'ল Path::resolve(যার জন্য জাভাডকে উল্লিখিত হয়েছে Paths::get) by স্ট্রিংসের একটি নির্বিচার দৈর্ঘ্যের অ্যারের জন্য কোনও পাথের টুকরো উপস্থাপন করে, এগুলি জাভা স্ট্রিম ব্যবহার করে একসাথে যোগদান করা যেতে পারে:

private static final String[] pieces = {
    System.getProperty("user.dir"),
    "data",
    "foo.txt"};
public static void main (String[] args) {
    Path dest = Arrays.stream(pieces).reduce(
    /* identity    */ Paths.get(""),
    /* accumulator */ Path::resolve,
    /* combiner    */ Path::resolve);
    System.out.println(dest);
}

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