2010-12-13 11 views
12

Jest to wejście jako ciąg:Java podzieliła ścieżkę ..?

"C:\jdk1.6.0\bin\program1.java" 

muszę wyjście jako:

Path-->C:\jdk1.6.0\bin\ 
file--->program1.java 
extension--->.java 

Uważaj na "\" char. Z łatwością otrzymałem dane wyjściowe dla "/".

+2

Jaki kod masz do tej pory? –

+0

Przechodząc do komentarza do rozwiązania @Kurt to zadanie domowe. Możesz usunąć ten tag. –

+0

To nie jest praca domowa. Dzielę to za pomocą indexOf() i subString(). Po prostu potrzebujemy, dlaczego nie możemy podzielić tego przy użyciu split() ...? Wciąż nie dostałem odpowiedzi na to. – yuvaraj

Odpowiedz

21

Klasa File daje wszystko, czego potrzebujesz:

File f = new File("C:\\jdk1.6.0\\bin\\program1.java"); 
    System.out.println("Path-->" + f.getParent()); 
    System.out.println("file--->" + f.getName());  
    int idx = f.getName().lastIndexOf('.'); 
    System.out.println("extension--->" + ((idx > 0) ? f.getName().substring(idx) : "")); 

EDIT: '' Thanks Dave dla zauważając, że String.lastIndexOf zwróci -1 jeśli File.getName nie zawiera.

+0

dziękuję .. :) Czy istnieje rozwiązanie przy użyciu String.split() ... ??? – yuvaraj

+3

Jeśli próbujesz ograniczyć się do String.split, zwróć uwagę na sposób, w jaki Kurt używa 'lastIndexOf()' –

+1

'Plik f = nowy plik (" C: \\ jdk1.6.0 \\ doc \\ readme "); '. Co robi twój kod w takim przypadku? –

3

Od File klasy Javy nie obsługuje sondowania za tym idzie, proponuję utworzyć podklasę File który daje taką możliwość:

package mypackage; 

/** 
* Enhances java.io.File functionality by adding extension awareness. 
*/ 
public class File extends java.io.File { 
    /** 
    * Returns the characters after the last period. 
    * 
    * @return An empty string if there is no extension. 
    */  
    public String getExtension() { 
    String name = getName(); 
    String result = ""; 
    int index = name.lastIndexOf('.'); 

    if(index > 0) { 
     result = name.substring(index); 
    } 

    return result; 
    } 
} 

Teraz wystarczy zastąpić wersję pliku dla wersji Java i po połączeniu z odpowiedzią Kurta, daje ci wszystko, czego potrzebujesz.

Należy zauważyć, że użycie podklasy jest idealne, ponieważ jeśli chcesz zmienić zachowanie (ze względu na inny system operacyjny z użyciem innego tokena separatora rozszerzenia), musisz zaktualizować tylko jedną metodę, a cała aplikacja będzie nadal działać. (Lub, jeśli chcesz naprawić błąd, tak jak próbuje wykonać str.substring(-1).)

Innymi słowy, jeśli wyodrębnić rozszerzenia pliku w więcej niż jednego miejsca w swojej bazie kodu masz popełnił błąd.

Idąc dalej, jeśli chcesz całkowicie abstrakcyjna wiedza o typie pliku (ponieważ niektóre systemy operacyjne mogą nie używać . separator), można napisać:

/** 
* Enhances java.io.File functionality by adding extension awareness. 
*/ 
public class File extends java.io.File { 
    public File(String filename) { 
    super(filename); 
    } 

    /** 
    * Returns true if the file type matches the given type. 
    */ 
    public boolean isType(String type) { 
    return getExtension().equals(type); 
    } 

    /** 
    * Returns the characters after the last period. 
    * 
    * @return An empty string if there is no extension. 
    */  
    private String getExtension() { 
    String name = getName(); 
    String result = ""; 
    int index = name.lastIndexOf('.'); 

    if(index > 0) { 
     result = name.substring(index); 
    } 

    return result; 
    } 
} 

uznałbym to znacznie więcej solidne rozwiązanie. Umożliwiłoby to bezproblemowe zastąpienie bardziej zaawansowanego mechanizmu wykrywania typu pliku (analiza zawartości pliku w celu określenia typu), bez konieczności zmiany kodu wywołującego. Przykład:

File file = new File("myfile.txt"); 
if(file.isType("png")) { 
    System.out.println("PNG image found!"); 
} 

Jeśli użytkownik zapisany „myfile.png” AS „pliku mojplik.txt”, obraz będzie nadal być przetwarzane, ponieważ zaawansowana wersja (nie pokazane tutaj) będzie wyglądać na „PNG” marker, który rozpoczyna każdy pojedynczy plik PNG w świecie (cyber).

+0

Może masz rację. Wszystko, co chcę wiedzieć, to dlaczego nie możemy podzielić tego przy użyciu String.split() ..? – yuvaraj

+0

Nie mogę podzielić ciągu za pomocą String.split(), używając "\\" jako ogranicznika. Cały łańcuch jest zwracany do pierwszego elementu tablicy. Nie wiem dlaczego ... Czy mógłbyś napisać kod do tego ...? – yuvaraj

+0

@yuvaraj: Mówię tylko, że 'String.split()' nie jest poprawnym sposobem napisania tej funkcji. Naprawdę powinieneś używać 'indexOf()' jak już wspomniano. –

8

Rozważ skorzystanie z istniejącego rozwiązania zamiast toczenia własnego i wprowadzenie więcej kodu, który należy przetestować. FilenameUtils z Apache Commons IO jest jednym z przykładów:

http://commons.apache.org/proper/commons-io/javadocs/api-2.4/org/apache/commons/io/FilenameUtils.html

+0

Może masz rację. Wszystko, co chcę wiedzieć, to dlaczego nie możemy podzielić tego przy użyciu String.split() ..? – yuvaraj

+0

Ja osobiście uważam na klasy użytkowe; uderzają w programowanie funkcjonalne, a nie obiektowe. Pakiet Apache Commons powinien rozszerzyć "Plik" bezpośrednio, aby poprawić jego zachowanie, jak już pokazałem. –

+1

@Dave Jarvis: Nie mogę się spierać, że to funkcjonalny API, a pod koniec dnia zależy to od osobistego gustu. Dla mnie sprowadza się to do korzyści wynikających z możliwości konserwacji w stosunku do implementacji interfejsu API. – Rhysyngsun

3

trzeba kompensować podwójne ukośniki zwrócony w Drodze (jeśli został wygenerowany programowo).

//Considering that strPath holds the Path String 
String[] strPathParts = strPath.split("\\\\"); 

//Now to check Windows Drive 
System.out.println("Drive Name : "+strPathParts[0]); 
Powiązane problemy