Quando ho ottenuto una classe java.lang.File con il codice File file = new File("e:/");
, ovviamente ho ottenuto una classe File rappresentata nella directory e: \.Si tratta di un bug in java jdk?
Ma se ho ottenuto una classe File con il codice File file = new File("e:");
e io solo nell'unità E :, quindi ho ottenuto una classe File rappresentata directory corrente.
Assumendo che sia nella directory E: \ dir \, e questa directory abbia un file denominato Test.java. E 'il contenuto è:
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());
}
}
}
Aprire lo strumento cmd e passare alla directory e: \ dir, eseguire il seguente comando in esso:
E:\dir> javac Test.java
E:\dir> java Test
ho ottenuto:
e:\Test.class false
e:\Test.java false
È un bug java jdk?
Ulteriori informazioni da @JimGarrison:
mi sono imbattuto questo codice
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());
}
}
in Eclipse (che vive sul mio D: azionamento) ed ha ottenuto il seguente risultato:
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
Che conferma che sta succedendo qualcosa di divertente.
Java Bug 8130462 sembra essere correlato in quanto ha a che fare con percorsi relativi rispetto assoluto in particolare in Windows.
Molto curioso. Posso riprodurre il problema pure. –
Ho eseguito il programma come scritto sopra (anche se ho modificato il nome della classe in TestFile) e ho ricevuto l'output previsto (file e directory elencati, ecc.) Per l'unità e: (Windows 10). Esecuzione di Java 1.8.0_72. @ JimGarrison è interessante che tu abbia riprodotto il problema. L'ho eseguito sia da Eclipse che dalla riga di comando. L'unica differenza è che avevo il nome di un pacchetto, quindi era java -cp ./bin package.TestFile – KevinO
Se si esegue un debugger e ci si ferma su 'println', si vede che c'è una differenza tra il percorso e il percorso canonico. L'output che vedi (manca la directory corrente) sembra essere quello che viene usato per cercare il file, ma la stampa del percorso canonico include la directory corrente. Certo sembra un bug (probabile nell'implementazione del provider di filesystem di Windows). La creazione di un file da una stringa di percorso completo esplicita non presenta questo problema. –