2012-01-09 23 views
26

Java7 jest dostarczana z domyślną implementacją Path dla plików lokalnych. Czy istnieje implementacja ścieżki dla adresów URL?java.nio.file.Path dla adresów URL?

Na przykład, powinny być w stanie skopiować zdalnego zasobu za pomocą następującego kodu:

Path remote = Paths.get(new URI("http://www.example.com/foo/bar.html")); 
Path local = Paths.get(new URI("/bar.html")); 
Files.copy(remote, local); 

Obecnie ten rzuca java.nio.file.FileSystemNotFoundException: Provider "http" not installed. Prawdopodobnie mógłbym to zaimplementować, ale wolałbym nie wymyślać koła.

+0

Co jest w stosunku do Files.copy (InputStream, Path)? Czy adresy URL stanowią ścieżkę do świata, którym jest sieć? Czy są one bardziej jak wskaźnik? Co najprawdopodobniej zyskasz? –

+0

@owastead, Moja biblioteka musi zwracać nieprzejrzyste ścieżki użytkownikom. Mogą kopiować te ścieżki (tylko do odczytu) do lokalnego systemu plików bez potrzeby sprawdzania, czy plik znajduje się lokalnie (tj. W bazie danych) lub zdalnie (serwer WWW). Brakuje atrybutów InputStreams, które chciałbym podać moim użytkownikom, takich jak nazwa pliku lub lastModified timestamp. – Gili

+0

Zrozumiano, ale to, co widzą użytkownicy, niekoniecznie musi być odzwierciedlone w podstawowej implementacji. –

Odpowiedz

3

Wygląda na to, że tak naprawdę starasz się zrobić to, co robi FTP - kopiować pliki z jednego miejsca do drugiego. Sugerowałbym, aby znaleźć lepsze sposoby, aby to zrobić z istniejącymi bibliotekami kodu FTP.

Identyfikatory URI nie są ścieżkami systemu plików, więc nie można ich traktować jako takich. Są to adresy/lokalizatory zasobów, które, gdy przejdziesz tam z przeglądarką (lub innym klientem, który je obsługuje), uruchamiają niektóre działania zdefiniowane przez serwer, który za nimi stoi. Nie ma standardu dla tego, co robi ten serwer, stąd elastyczność usług internetowych. Dlatego też, jeśli twój serwer robi, aby żądania HTTP były przesyłane w ten sposób w celu ułatwienia kopiowania plików, będziesz musiał przetasować własne i przekazać dane pliku do żądania POST. Aby powiedzieć inaczej, (1) nie traktuj URI, tak jak są to ścieżki systemu plików - nie są, (2) znajdź bibliotekę FTP do kopiowania plików i/lub (3) jeśli naprawdę chcesz zbudować usługę internetową, która to zrobi, streścić szczegóły kopiowania plików za pomocą żądania POST. Jeśli zrobisz # 3, zrozumiesz, że twój budynek jest bardzo zbliżony do niestandardowego i że prawdopodobnie będzie działał tylko w podzbiorze witryn zgodnych z twoim projektem (tj. Tymi, które sam budujesz). Nie ma standardowego zestawu parametrów lub "kopiowania plików" za pomocą polecenia POST, że jestem świadomy tego, że możesz wykorzystać to, aby to "po prostu działać" - będziesz musiał dopasować swoje żądanie HTTP do usługi sieciowej na po stronie serwera.

+0

Co jest warte, ktoś przetoczył ogólną przeglądarkę katalogów HTTP na https://issues.apache.org/jira/browse/VFS-199. W moim przypadku serwer WWW musi przestrzegać określonej przeze mnie struktury katalogów, więc będę musiał uruchomić odpowiednią implementację Path. Dziękuję za pomoc w zrozumieniu, dlaczego potrzebna jest niestandardowa implementacja. – Gili

+0

Coolio - cieszę się, że mogłem pomóc i cieszę się, że znalazłeś ten projekt. – jefflunt

+0

@Normalocity To prawie nie ma związku i po prostu robię to z mojej głowy, ale myślę, że obecnie nie ma metody w Javie 7, która zwróciłaby 'Path' dla _classpath resource_, która byłaby bardzo miły. Co sądzisz o tym? Myślę, że byłoby miło, ponieważ 'Path' jest o wiele ładniejszy niż' URL'. –

0

Miałem do czynienia z podobnym problemem i napisałem małą metodę rozwiązania tego problemu, które można znaleźć poniżej.

Działa poprawnie w przypadku konkatenacji adresów URL i względnych sufiksów. Uważaj, aby nie nadać sufiksu absolutnemu z powodu zachowania funkcji rozstrzygania identyfikatora URI.

private URI resolveURI(String root, String suffix) { 
    URI uri; 
    try { 
     uri = new URI(root + "/").resolve(suffix); 
    } catch (URISyntaxException e) { 
     //log 
    } 
    return uri; 
} 
Powiązane problemy