जब मुझे File file = new File("e:/");
कोड के साथ java.lang.File क्लास मिला, तो निश्चित रूप से मुझे एक फ़ाइल क्लास ई: \ निर्देशिका का प्रतिनिधित्व करता है।क्या यह जावा jdk में एक बग है?
लेकिन अगर मुझे कोड File file = new File("e:");
कोड के साथ फ़ाइल क्लास मिला है और मैं बस ड्राइव ई में हूं, तो मुझे एक फ़ाइल क्लास वर्तमान निर्देशिका का प्रतिनिधित्व करता है।
मान लें कि मैं निर्देशिका में हूं E: \ dir \, और इस निर्देशिका में test.java नाम की एक फ़ाइल है। यह सामग्री है:
import java.io.File;
public class Test {
public static void main(String[] args) {
File file = new File("e:");
File[] files = file.listFiles();
for(File f: files){
System.out.println(f + " " + f.exists());
}
}
}
ओपन cmd उपकरण और करने के लिए निर्देशिका ई नेविगेट: \ dir, उस में निम्न आदेश निष्पादित करें:
E:\dir> javac Test.java
E:\dir> java Test
मुझे मिल गया:
e:\Test.class false
e:\Test.java false
क्या यह एक जावा जेडीके बग है?
@JimGarrison से अतिरिक्त जानकारी:
मैं इस कोड
public class Foo3
{
public static void main(String[] args) throws Exception
{
File f = new File("D:");
System.out.println(f.getCanonicalPath());
for (File x : f.listFiles())
System.out.println(x + " " + x.getCanonicalPath() + " " + x.getAbsolutePath() + " " + x.exists() + " " + x.getAbsoluteFile().exists());
}
}
ग्रहण (जो मेरे डी पर रहता है: ड्राइव) में
भाग गया और निम्न उत्पादन मिल गया:
D:\dev\src\pdxep
D:\.classpath D:\dev\src\pdxep\.classpath D:\dev\src\pdxep\.classpath false true
D:\.project D:\dev\src\pdxep\.project D:\dev\src\pdxep\.project false true
D:\.settings D:\dev\src\pdxep\.settings D:\dev\src\pdxep\.settings false true
D:\gallery D:\dev\src\pdxep\gallery D:\dev\src\pdxep\gallery false true
D:\pom.xml D:\dev\src\pdxep\pom.xml D:\dev\src\pdxep\pom.xml false true
D:\src D:\dev\src\pdxep\src D:\dev\src\pdxep\src false true
D:\target D:\dev\src\pdxep\target D:\dev\src\pdxep\target false true
जो पुष्टि करता है कि कुछ मजाकिया चल रहा है।
जावा Bug 8130462 संबंधित प्रतीत होता है क्योंकि इसे विशेष रूप से विंडोज़ में सापेक्ष बनाम पूर्ण पथ के साथ करना है।
बहुत उत्सुक। मैं भी समस्या को पुन: पेश कर सकता हूं। –
मैंने ऊपर लिखा गया प्रोग्राम चलाया (हालांकि मैंने क्लास नाम को टेस्टफाइल में संशोधित किया), और ई: ड्राइव (विंडोज 10) के लिए अपेक्षित आउटपुट (फाइलें और निर्देशिका सूचीबद्ध, इत्यादि) प्राप्त की। जावा 1.8.0_72 चल रहा है। @JimGarrison यह दिलचस्प है कि आपने इस मुद्दे को पुन: उत्पन्न किया। ग्रहण और कमांड लाइन पर दोनों इसे चलाएं। केवल अंतर यह है कि मेरे पास पैकेज नाम था इसलिए यह जावा-सीपी ./bin पैकेज था। टेस्टफाइल – KevinO
यदि आप डीबगर में भागते हैं और 'println' पर रुकते हैं तो आप देख सकते हैं कि पथ और कैननिकल पथ के बीच कोई अंतर है। आपके द्वारा देखे जाने वाले आउटपुट (वर्तमान निर्देशिका को याद करना) फ़ाइल की तलाश करने के लिए उपयोग किया जाता है, लेकिन कैननिकल पथ को प्रिंट करने से वर्तमान निर्देशिका शामिल होती है। निश्चित रूप से एक बग की तरह दिखता है (संभवतः विंडोज फाइल सिस्टम प्रदाता के कार्यान्वयन में)। एक स्पष्ट पूर्ण पथ स्ट्रिंग से फ़ाइल बनाना इस समस्या में नहीं है। –