Java 7 Yolunun uzantısı nasıl kontrol edilir


84

Bir Yolun (Java 7'de tanıtılan) belirli bir uzantıyla bitip bitmediğini kontrol etmek istiyorum . endsWith()Yöntemi şöyle denedim :

Path path = Paths.get("foo/bar.java")
if (path.endsWith(".java")){
    //Do stuff
}

Ancak, bu işe yaramıyor çünkü path.endsWith(".java")yanlış döndürüyor. Görünüşe göre endsWith()yöntem yalnızca son dizin ayırıcısından (örn. bar.java) Sonra her şey için tam bir eşleşme varsa , bu benim için pratik değil.

Peki bir Yolun dosya uzantısını nasıl kontrol edebilirim?



1
@assylias, bu soruya bir uzantısını bulmak içindir String, bir Path(o ile çalışmak olsa da Path.toString(), ama ben gerektirir olmaz bir yol umuyordum).
Thunderforge

Dosya uzantısı kavramı os bağımlıdır, bu yüzden Dosya veya Yol'da bunun için destek olduğunu düşünmüyorum.
assylias

@assylias: Bu berbat. Dosya uzantısı kavramı iyi tanımlanmıştır ve Windows / Linux / MacOs / Android'de birçok kez kullanılmaktadır. Linux'ta Windows'dakinden daha az önemli olsalar da, yine de masaüstü ve sunucu uygulamalarında çok kullanılıyorlar.
Eric Duminil

Yanıtlar:


84

Java MİT'in PathMatcher sağlar FileSystem.getPathMatcher (Dize syntaxAndPattern) :

PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.java");

Path filename = ...;
if (matcher.matches(filename)) {
    System.out.println(filename);
}

Ayrıntılar için Dosyaları Bulma eğitimine bakın.


14
Benim için aşağıdaki çalışmaları, bu bir yıldız işareti eksik olduğunu düşünüyorum:PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.java");
Josh

22
Farklı dizinlere bakıyorsanız, "glob: **. Java" kullanmanız gerekir
LaGrandMere

1
Benim için LaGrandMere'nin yorumu hile yaptı. @Dave Jarvis tavsiyesini seçilen cevapla birleştirebilseydi, sanırım bu NIO-API'de yeni başlayanlara yardımcı olur. Windoze altında: Kullanmak istersem glob:*.java, o zaman filenameherhangi bir ebeveyn yolu içermemelidir. Gibi bir rel / abs yolu kullanırsam glob:c:/users/muchwow/*.java, işe yarar (\\\\ 'nin ters eğik çizgilerle kullanılması gerektiğini unutmayın). Kalıp glob:**.java, ana yoldan bağımsız olarak, içinde * .java olan her şeyi arar.
JackLeEmmerdeur

67

PathDosya sistemi kendisi bu yok muhtemelen sınıfı "extension" kavramını yok. Bu yüzden Stringtemsilini kontrol etmeniz ve dört beş karakterlik dizeyle bitip bitmediğini görmeniz gerekir .java. Ve endsWithgibi karışık büyük / küçük harfleri kapsamak istiyorsanız basitten farklı bir karşılaştırmaya ihtiyacınız olduğunu unutmayın :".JAVA"".Java"

path.toString().toLowerCase().endsWith(".java");

Olası NullPointer nedeniyle bu iyi bir çözüm değildir. Yukarıda bahsedildiği gibi bir kütüphane (örneğin apache IO araçları) veya PathMatcher kullanmak daha iyidir.
KHanusova

15

Basit çözüm:

if( path.toString().endsWith(".java") ) //Do something

Path.endsWith yöntemini kullanırken dikkatli olmalısınız. Belirttiğiniz gibi, yöntem yalnızca Path nesnenizin bir alt öğesiyle eşleşirse true değerini döndürür . Örneğin:

Path p = Paths.get("C:/Users/Public/Mycode/HelloWorld.java");
System.out.println(p.endsWith(".java")); // false
System.out.println(p.endsWith("HelloWorld.java")); // true

3

Bunu doğrudan Path nesnesinin kendisinde yapmanın bir yolu yoktur.

Görebildiğim iki seçenek var:

  1. Yolu bir Dosyaya dönüştürün ve EndWith öğesini File.getName () tarafından döndürülen String üzerinde çağırın
  2. Yolda toString'i çağırın ve bu String üzerinde biterWith'i çağırın.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.