2009-10-12 16 views
8

Jeśli mam zasób w ścieżce klas, mogę oba załadować go jako strumień, a nawet istnieje jego URL reprezentacja. Niestety niektóre implementacje URL-a nie implementują poprawnie LastModified.Biorąc pod uwagę zasób classpath, czy istnieje sposób na uzyskanie obiektu java.io.File, który zawiera/zawiera go?

Chciałbym wziąć ścieżkę do czegoś w ścieżce klas, a następnie rozwiązać ją do pliku, który znajduje się na dysku - jeśli jest w słoiku, to plik wskazujący na słoik jest w porządku. Mogę następnie pobrać obiekt LastModified z obiektu File zamiast adresu URL, co będzie bardziej pomocne.

Odpowiedz

12

Ogólnie rzecz biorąc:

URL url = this.getClass().getResource(myResource); 
    String fileName; 
    if (url.getProtocol().equals("file")) { 
     fileName = url.getFile();   
    } else if (url.getProtocol().equals("jar")) { 
     JarURLConnection jarUrl = (JarURLConnection) url.openConnection(); 
     fileName = jarUrl.getJarFile().getName();    
    } else { 
     throw new IllegalArgumentException("Not a file"); 
    } 
    File file = new File(fileName); 
    long lastModified = file.lastModified(); 

powinien robić, co chcesz. Będziesz musiał złapać wyjątek IOException.

-1

Nie. Nie można tego zrobić ogólnie, ponieważ URL może reprezentować zasoby, które nie są powiązane z plikiem. Na przykład może to być HTTP, FTP lub JNDI itp.

Możesz sprawdzić protokół i utworzyć plik samodzielnie, jeśli protokół jest oparty na plikach, np. "File: // ścieżka", "jar: // ścieżka ! ... ".

Powiązane problemy