2009-06-22 10 views
16

'dan bağımsız olarak yolun mutlak olup olmadığını öğrenmek için Java'da, verilen yolun mutlak olup olmadığını veya programın çalışmakta olduğu platforma bakılmaksızın herhangi bir yol bulmak için var mı? Aşağıdaki örnekte olduğu gibi Yani, istediğim muhtemelen bir şey: Linux'taJava: OS

: Windows'ta

new File("/home/").isAbsolute() // Should return true. 
new File("C:/My Documents").isAbsolute() // Should *also* return true. 

:

new File("C:/Documents").isAbsolute() // Should return true. 
new File("/home/").isAbsolute() // Should *also* return true. 

muhtemelen kod şey bu çevrede olsun ama yapmak olabilir Sadece bu sorunu çözmek için Java'da sağlanan yerleşik bir sınıfı bilip bilmediğini öğrenmek istedim. Ya da bu problemi kimseye mi geldi? Ve bunu nasıl çözdün?

Teşekkürler!

+1

, "c:/belgelerim" gibi bir yol muhtemelen geçersiz olduğunu ve kesinlikle mutlak değildir. Posix standardını uygulayan sistemlerde, tüm yollar tek bir "root" un altında bulunur ve bu nedenle mutlak bir yol bu kökte başlar. Böylece mutlak bir yol daima "/" ile başlar. Sürecin mevcut çalışma dizinine göre herhangi bir şey alınır. Linux üzerinde, "C:/...", geçerli çalışma dizini içindeki "C:" olarak adlandırılan ve büyük ihtimalle anlamsız olan dizini ifade eder. – SingleNegationElimination

+1

Sorunuz çok az anlam ifade ediyor. Tüm yolların mutlak olduğu varsayımsal bir işletim sistemi düşünün. Bu işletim sisteminde java olduğunu varsayalım. Bu nedenle, gereksiniminizi karşılamak için, programın çalışmakta olduğu platform ne olursa olsun, her zaman doğru olarak döndüren bir isFileAbsolute() yöntemine gereksiniminiz vardır. Uygulaması kolay, ama anlamsız. –

+0

Kullanıcının uzak bilgisayarda çalışan bir dizini yapılandırdığı bir durum var. Uzak bilgisayar Unix veya Windows çalıştırabilir (en yaygın senaryo yerel makine penceredir ve uzak makinenin unixidir). Kullanıcı tarafından belirlenen yolun doğrulanması gerekir ve bir yolun mutlak olup olmadığını belirlemek için gereklidir. –

cevap

10

Hayır.

Bazı yatan FileSystem sınıfları (yani Java 7, ama onlar da bunun öncesinde mevcut) isAbsolute (açığa olduğunu), ancak kamu değiliz - böylece bile bunları kullanmak ve olmamalıdır Kodunuz yansıma önemsiz doluydu - ve sadece "doğru" işletim sistemi JRE'ye dahil edildi, bu yüzden yine de onları çevrelemek zorunda kalacaksınız.

Başlamak için isAbsolute (...) 'ın Java 7 uygulamaları aşağıda verilmiştir. File.getPrefixLength() paket özel olduğunu unutmayın.

Win32FileSystem:

public boolean isAbsolute(File f) 
{ 
     int pl = f.getPrefixLength(); 
     return (((pl == 2) && (f.getPath().charAt(0) == slash)) 
       || (pl == 3)); 
} 

UnixFileSystem: Bu (Java 6) kullanılarak sona erdi

public boolean isAbsolute(File f) 
{ 
     return (f.getPrefixLength() != 0); 
} 
+9

Altı yıl sonra bu sorunun güncel olmadığını unutmayın. Günümüzde, File sınıfı bir "[isAbsolute()] (http://docs.oracle.com/javase/7/docs/api/java/io/File.html#isAbsolute)" yöntemini içerir. d bekliyoruz: _ "Bu soyut yol adının mutlak olup olmadığını test eder. Mutlak yol adının tanımı sisteme bağlıdır. UNIX sistemlerinde, önek"/"ise bir yol adı mutlaktır. Microsoft Windows sistemlerinde, önekse bir yol adı mutlaktır. "\\" ifadesini izleyen bir sürücü belirtecidir veya önek "\\\\" _ – Guus

-1

:

private static boolean testPath(String path) { 
    int prefixLen = FilenameUtils.getPrefixLength(path); 
    if (testPathWin(path, prefixLen) || testPathLinux(prefixLen)) 
     return true; 
    else 
     return false; 
} 

private static boolean testPathWin(String path, int prefixLen) { 
    if (prefixLen == 3) 
     return true; 
    File f = new File(path); 
    if ((prefixLen == 2) && (f.getPath().charAt(0) == '/')) 
     return true; 
    return false; 
} 

private static boolean testPathLinux(int prefixLen) { 
    return (prefixLen != 0); 
} 
+0

yüklüyse, Windows 7 için ortak boolean isAbsolute (Dosya f) kopyaladınız, ancak Apache commons FilenameUtils.getPrefixLength() yöntemini kullanıyorsunuz GetPrefixLength() 'ın Java 7 uygulaması ve Apache uygulaması aynı değildir .. UNC yolları için apache önek olarak "\\ foo \ poo" -> "\\ foo \" döndürecek ve uzunluk 6 – acheron55

+0

@ Acheron55 olacaktır: Hangi "isAbsolute()" anlıyor musunuz? Kaynak snippet'inde tam olarak nerede var? – stuhpa

+0

t o FilenameUtils.getPrefixLength (yol) kaynak kodu. UNC yolları için herhangi bir sayıda uzunluk döndürebilir. Ancak, yalnızca testPathWin yönteminizde 2 veya 3 uzunluğunu kontrol edersiniz. Yani yanlış. Eğer java uygulamasını kullanabilirseniz doğru olurdu. Çünkü sadece 0,1,2,3 değerini döndürüyor. Ayrıca bu satır: 'if (testPathWin (yol, prefixLen) || testPathLinux (prefixLen))' linux denetimi daha geniş bir aralığa sahip olduğu için windows yönteminizi kullanamaz hale getirir. Uzunluğunun bir pencere yolu için 1 olduğunu varsayalım, ama testPath yönteminiz hala doğrudur, bu yanlıştır. – acheron55

3

bu kullanarak Apache FilenameUtil Benim çatlak -

public static boolean isAbsolute(final String path) { 
     return FilenameUtils.getPrefixLength(path) != 0; 
    } 

Teknik olarak bu geri geliyor! Amaçlarım için sorun yok. Java 7'de

8

: linux üzerinde

new File(path).isAbsolute()