GetPath (), getAbsolutePath (), और getCanonicalPath () के बीच जावा में क्या अंतर है?


583

बीच क्या अंतर है getPath(), getAbsolutePath()और getCanonicalPath()जावा में?

और मैं हर एक का उपयोग कब करूं?


मत भूलो Path.toAbsolutePath().normalize()जो विहित (वास्तविक) पथ और पूर्ण पथ के बीच एक अच्छा मध्य मैदान है।
Eckes

जवाबों:


625

इन फ़ाइलनामों पर विचार करें:

C:\temp\file.txt - यह एक मार्ग है, एक निरपेक्ष मार्ग है, और एक विहित मार्ग है।

.\file.txt- यह एक रास्ता है। यह न तो कोई पूर्ण मार्ग है और न ही कोई विहित मार्ग।

C:\temp\myapp\bin\..\\..\file.txt- यह एक मार्ग और निरपेक्ष मार्ग है। यह एक विहित मार्ग नहीं है।

एक विहित मार्ग हमेशा एक निरपेक्ष पथ होता है।

एक मार्ग से एक विहित पथ में परिवर्तित करना इसे पूर्ण बनाता है (आमतौर पर वर्तमान काम करने वाली निर्देशिका से निपटता है इसलिए जैसे ./file.txtबन जाता है c:/temp/file.txt)। किसी फ़ाइल का विहित पथ केवल पथ को "शुद्ध" करता है, जैसे सामान को हटाना और हल करना और ..\सीक्लिंक्स (यूनिक्स पर) को हल करना।

Nio.Paths के साथ निम्नलिखित उदाहरण पर भी ध्यान दें:

String canonical_path_string = "C:\\Windows\\System32\\";
String absolute_path_string = "C:\\Windows\\System32\\drivers\\..\\";

System.out.println(Paths.get(canonical_path_string).getParent());
System.out.println(Paths.get(absolute_path_string).getParent());

जबकि दोनों रास्ते एक ही स्थान को संदर्भित करते हैं, आउटपुट काफी अलग होगा:

C:\Windows
C:\Windows\System32\drivers

11
एफडब्ल्यूआईडब्ल्यू, यह एक दिया नहीं है जो C:\temp\file.txtएक विहित पथ है - अस्थायी निर्देशिका एक फाइल सिस्टम सॉफ्ट लिंक या हार्ड लिंक (एनटीएफएस में एक जंक्शन) हो सकती है, और फाइल सॉफ्ट एक नरम लिंक हो सकती है। मुझे नहीं पता कि फाइल सिस्टम फाइलों के हार्ड लिंक को अलग कर सकता है या नहीं।
लॉरेंस डोल

1
पथ वास्तव में उन मुद्दों या घटकों में से किसी के अस्तित्व पर विचार नहीं करता है, केवल इसका सिंटैक्स।
llc

यह करता है, विहित पथ (सामान्य पथ के विपरीत) फ़ाइल सिस्टम को हिट करता है।
Eckes

1
मूल रूप से, मैं एक कारण नहीं देख सकता कि किसी को getAbsolutePath()इसके बजाय का उपयोग क्यों करना चाहिए getCanonicalPath()। यह बेहतर भी लगता है क्योंकि विहित एक स्वचालित रूप से उन ../हिस्सों को हल करता है ।
Scadge

यह मत भूलो कि थोड़ी देर के लिए getCanonicalPathफेंकता है , अगर यह एक विचार है। IOExceptiongetAbsolutePath
कार्ट

129

इस तरह की चीजों के लिए मुझे सबसे अच्छा तरीका मिल गया है कि उन्हें आजमाएं:

import java.io.File;
public class PathTesting {
    public static void main(String [] args) {
        File f = new File("test/.././file.txt");
        System.out.println(f.getPath());
        System.out.println(f.getAbsolutePath());
        try {
            System.out.println(f.getCanonicalPath());
        }
        catch(Exception e) {}
    }
}

आपका आउटपुट कुछ इस तरह होगा:

test\..\.\file.txt
C:\projects\sandbox\trunk\test\..\.\file.txt
C:\projects\sandbox\trunk\file.txt

इसलिए, getPath()आपको फ़ाइल ऑब्जेक्ट के आधार पर रास्ता देता है, जो सापेक्ष हो सकता है या नहीं; getAbsolutePath()आप फ़ाइल के लिए एक पूर्ण मार्ग देता है; और getCanonicalPath()आप फ़ाइल के लिए अद्वितीय निरपेक्ष पथ देता है। ध्यान दें कि बड़ी संख्या में निरपेक्ष पथ हैं जो एक ही फ़ाइल को इंगित करते हैं, लेकिन केवल एक कैनोनिकल पथ।

प्रत्येक का उपयोग कब करें? इस बात पर निर्भर करता है कि आप क्या हासिल करने की कोशिश कर रहे हैं, लेकिन अगर आप यह देखने की कोशिश कर रहे हैं कि क्या दो Filesडिस्क पर एक ही फाइल पर इशारा कर रहे हैं, तो आप उनके विहित रास्तों की तुलना कर सकते हैं। सिर्फ एक उदाहरण।


7
यह तर्क है कि जावा को यह "पूर्ण" पथ के कार्यान्वयन के लिए गलत है; यह वास्तव में किसी भी रिश्तेदार पथ तत्वों को पूर्ण पथ में हटा देना चाहिए। विहित रूप तब मार्ग में किसी भी FS लिंक या जंक्शनों को हटा देगा।
लॉरेंस डोल

but if you were trying to see if two Files are pointing at the same file on diskकैसे? उदाहरण कृपया?
आसिफ मुश्ताक

@UnKnown: आप इसके लिए विहित पथ का उपयोग करेंगे।
लॉरेंस Dol

67

संक्षेप में:

  • getPath()उस पथ स्ट्रिंग को प्राप्त करता है जिसे Fileऑब्जेक्ट के साथ बनाया गया था, और यह सापेक्ष वर्तमान निर्देशिका हो सकती है।
  • getAbsolutePath() यदि यह सापेक्ष है, तो यह पूरी तरह से योग्य पथ के परिणामस्वरूप वर्तमान निर्देशिका के खिलाफ हल करने के बाद पथ स्ट्रिंग प्राप्त करता है।
  • getCanonicalPath()वर्तमान निर्देशिका के खिलाफ किसी भी रिश्तेदार पथ को हल करने के बाद पथ स्ट्रिंग प्राप्त करता है, और किसी भी सापेक्ष पथिंग ( .और ..) को हटाता है , और कोई भी फाइल सिस्टम लिंक एक पथ को लौटाने के लिए करता है जिसे फाइल सिस्टम विहित साधन का संदर्भ देता है जिसे वह फाइल सिस्टम ऑब्जेक्ट को संदर्भित करता है।

साथ ही, इनमें से प्रत्येक में एक फ़ाइल समतुल्य है जो संबंधित Fileवस्तु को लौटाता है ।


36

getPath()Fileऑब्जेक्ट बनाने के लिए उपयोग किया गया पथ देता है । यह वापसी मान इसे चलाए जाने वाले स्थान के आधार पर नहीं बदला गया है (परिणाम नीचे दी गई खिड़कियों के लिए हैं, विभाजक स्पष्ट रूप से अन्यत्र भिन्न हैं)

File f1 = new File("/some/path");
String path = f1.getPath(); // will return "\some\path"

File dir = new File("/basedir");
File f2 = new File(dir, "/some/path");
path = f2.getPath(); // will return "\basedir\some\path"

File f3 = new File("./some/path");
path = f3.getPath(); // will return ".\some\path"

getAbsolutePath()निष्पादन स्थान या ड्राइव के आधार पर पथ को हल करेगा। तो अगर से चला c:\test:

path = f1.getAbsolutePath(); // will return "c:\some\path"
path = f2.getAbsolutePath(); // will return "c:\basedir\some\path"
path = f3.getAbsolutePath(); // will return "c:\test\.\basedir\some\path"

getCanonicalPath()प्रणाली पर निर्भर है। यह उस अद्वितीय स्थान को हल करेगा जिसका प्रतिनिधित्व पथ करता है। इसलिए यदि आपके पास कोई रास्ता है तो वे आमतौर पर हटा दिए जाएंगे।

इनका उपयोग कब करना है। यह इस बात पर निर्भर करता है कि आप क्या हासिल करने की कोशिश कर रहे हैं। getPath()पोर्टेबिलिटी के लिए उपयोगी है। getAbsolutePath()फ़ाइल सिस्टम स्थान खोजने के लिए उपयोगी है, और getCanonicalPath()यह जांचने के लिए विशेष रूप से उपयोगी है कि क्या दो फाइलें समान हैं।


क्या आप मुझे इसका कोई उदाहरण दे सकते हैं? getCanonicalPath() is particularly useful to check if two files are the same.
आसिफ मुश्ताक

20

अपने सिर को चारों ओर पाने के लिए बड़ी बात यह है कि Fileवर्ग सूर्य के एक दृश्य का प्रतिनिधित्व करने की कोशिश करता है जो सूर्य को "पदानुक्रमित पथनाम" कहता है (मूल रूप से एक पथ जैसा c:/foo.txtया /usr/muggins)। यही कारण है कि आप पथ के संदर्भ में फ़ाइलें बनाते हैं। आपके द्वारा वर्णित ऑपरेशन इस "पाथनाम" पर सभी ऑपरेशन हैं।

  • getPath()फ़ाइल के साथ बनाया गया पथ प्राप्त करता है ( ../foo.txt)
  • getAbsolutePath()जिस पथ के साथ फ़ाइल बनाई गई थी उसे प्राप्त करता है, लेकिन पथ के सापेक्ष होने पर वर्तमान निर्देशिका के बारे में जानकारी शामिल करता है ( /usr/bobstuff/../foo.txt)
  • getCanonicalPath() फ़ाइल के लिए निरपेक्ष पथ का एक अनूठा प्रतिनिधित्व लाने का प्रयास करता है। यह ".." और "" से अप्रत्यक्ष को समाप्त करता है। संदर्भ ( /usr/foo.txt)।

नोट मैं कहता हूं कि प्रयास - एक कैनोनिकल पथ बनाने में, वीएम एक फेंक सकता है IOException। यह आमतौर पर होता है क्योंकि यह कुछ फ़ाइल सिस्टम ऑपरेशन कर रहा है, जिनमें से कोई भी विफल हो सकता है।


3

मुझे लगता है कि मुझे शायद ही कभी उपयोग करने की आवश्यकता है getCanonicalPath()लेकिन, अगर फ़ाइल को फ़ाइलनाम के साथ दिया जाता है जो कि विंडोज पर DOS 8.3 प्रारूप में है, जैसे कि java.io.tmpdirसिस्टम प्रॉपर्टी रिटर्न, तो यह विधि "पूर्ण" फ़ाइल नाम लौटाएगी।

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