जावा में पथ जुड़ना


99

में 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/testdata/foo.txt/home/user/test/data/foo.txt


1
यह कुछ ऐसा हो सकता है जो मैं नहीं देख रहा हूं। आपका वर्तमान पथ "" है। आपका दूसरा रास्ता "डेटा / foo.txt" है। हो सकता है कि आपकी समस्या यह हो कि आप इसके बजाय पथ ऑब्जेक्ट को प्रिंट कर रहे होंfilepath.toString()
cjds

2
उपयोगnew File(parent, child)
saka1029

जवाबों:


100

भले ही 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

22

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");

11

कोई विशिष्ट विधि नहीं।

यदि आप जावा 8 या बेहतर का उपयोग करते हैं, तो आपके पास 2 विकल्प हैं:

a) java.util.StringJoiner का उपयोग करें

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

b) का उपयोग करें String.join(File.pathSeparator, "path1", "path2");

यदि आप जावा 7 या उससे कम का उपयोग करते हैं, तो आप अपाचे कॉमन्स से कॉमन्स-लैंग लाइब्रेरी का उपयोग कर सकते हैं। StringUtils के पास एक विभाजक का उपयोग करके तार को मिलाने का एक तरीका है।

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

एक सिडनोट: आप विंडोज़ के लिए linux pathseparator "/" का उपयोग कर सकते हैं (बस याद रखें कि निरपेक्ष पथ कुछ इस तरह के हैं "/ C: / mydir1 / mydir2"। हमेशा "/" का उपयोग करना बहुत उपयोगी होता है यदि आप फ़ाइल जैसे प्रोटोकॉल का उपयोग करते हैं: //।


स्ट्रिंगरजॉइनर ने मुझे लौटाया/home/user/test:foo.txt
साइबरनेट्रकॉन

आपके द्वारा ज्ञात विकल्प केवल अस्तित्व में नहीं हैं। उदाहरण के लिए, योजक के बजाय स्ट्रिंगबर्ल का उपयोग किया जा सकता है। और वास्तव में, फ़ाइलों / रास्तों के बजाय स्ट्रिंग्स के आधार पर आपका कार्यान्वयन काफी अनुभवहीन है और कई परिदृश्यों में समस्याओं को जन्म देगा।
XenoRo

2
File.separatorमेरे बजाय काम कियाFile.pathSeparator
इवान सिरोकी

।। उपयोग Pathes.get ( "path1", "Path2") toAbsolutePath () toString ()
Erdinç एय

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)। पथ के टुकड़ों का प्रतिनिधित्व करने वाले स्ट्रिंग्स की एक मनमानी-लंबाई वाली सरणी के लिए, इन्हें जावा स्ट्रीम का उपयोग करके एक साथ जोड़ा जा सकता है:

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);
}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.