Díl 4
Java Paths
Navazujeme na minulý díl, ve kterém jsme shrnuli Opětovné vyvolání výjimek, Použití operátoru diamant a Anotace.
Java 7 představuje několik nových tříd a rozhraní pro lepší práci se souborovým systémem. Tyto třídy nahrazují třídy z balíčku java.io. Nové třídy naleznete v balíčku java.nio. Nyní se zaměříme především na java.nio. file.Path a Paths. Path objekt reprezentuje cestu k souboru či adresáři na souborovém sytému. Co vše umožňuje, vidíme na příkladu:
Kód
... Path path = FileSystems.getDefault().getPath("/home/docs/status.txt"); System.out.println(); System.out.printf("toString: %s\n", path.toString()); //Výstup: toString: \home\docs\status.txt, na Windows platformě. System.out.printf("getFileName: %s\n", path.getFileName()); //getFileName: status.txt System.out.printf("getRoot: %s\n", path.getRoot()); //getRoot: \ System.out.printf("getNameCount: %d\n", path.getNameCount()); //getNameCount: 3 for(int index=0; index < path.getNameCount(); index++) { System.out.printf("getName(%d): %s\n", index, path.getName(index)); //getName(0): home, getName(1): docs, getName(2): status.txt } System.out.printf("subpath(0,2): %s\n", path.subpath(0, 2)); //subpath(0,2): home\docs System.out.printf("getParent: %s\n", path.getParent()); //getParent: \home\docs System.out.println(path.isAbsolute()); // false – nejedná se o absolutní cestu. Ta by obsahovala i disk, např: E:\ }
Lomítka v getPath fungují na všech platformách, samozřejmě na Windows systémech lze použít i dvojitá zpětná lomítka \\.
Mezi starší třídou java.io.File a novou java.nio.file.Files lze snadno přecházet pomocí metody toPath.
Kód
public static void main(String[] args) { try { Path cesta = Paths.get(new URI("file:///E:/home/docs/uzivatele.txt")); File soubor = new File("E:\\home\\docs\\uzivatele.txt"); Path toPath = soubor.toPath(); System.out.println(toPath.equals(cesta)); } catch (URISyntaxException e) { System.out.println("Bad URI"); } }
Toto porovnání vrátí výsledek TRUE, soubor a cesta jsou totožné. Zde navíc vidíte onen povolený dvojí zápis cesty k souboru pro všechny platformy a pro Windows. Díky třídám Path a Files snadno získáte atributy souboru či adresáře, například jejich existenci (Files.exists, Files.notExists), zda jsou souborem či adresářem (Files.isDirectory, Files.isRegularFile), zda jsou spustitelné, ke čtení, lze do nich zapisovat, jsou skryté či symbolickými linky (Files.isExecutable, Files.isReadable, Files.isWritable, Files.isHidden, Files.isSymbolicLink).
Třída Path obsahuje mnoho metod, je vhodné mít přehled, nicméně jejich výčet zde by byl zbytečný. Třída Paths pak obsahuje dvě statické metody get, jednu pro převod Stringu na Path a druhou pro převod URI na Path.
FileSystem a FileStore
Operační systém nemusí podporovat všechna zobrazení (views) jazyka Java, proto existují tři základní postupy zjištění správného zobrazení podporovaných atributů. Výčet podporovaných atributů naleznete zde
Jednoduchým postupem si necháme zobrazit, které atributy souborového systému jsou podporovány naší aktuální platformou.
Kód
public static void main(String[] args) { Path path = Paths.get("C:/home/docs/users.txt"); FileSystem fileSystem = path.getFileSystem(); SetsupportedViews = fileSystem.supportedFileAttributeViews(); for(String view : supportedViews) { System.out.println(view); } }
Na systému Windows 7 byste měli vidět tento výstup:
acl
basic
owner
user
dos
Ale například na Ubuntu verze 14.04 s FS ext4 uvidíte tento výstup (upravte si samozřejmě vstupní soubor):
basic
owner
user
unix
dos
posix
acl definuje přístupová práva na systémech se souborovým systémem odvozeným od NFSv4 (tak praví Java dokumentace), nicméně převážně se objevují na operačních systémech Windows. Testoval jsem, zda se objeví ACL položka v atributu souboru na Ubuntu, kde byl soubor v adresáři namapován přes NFSv4 (localhost:/home on /mnt/a type nfs (rw,vers=4,addr=127.0.0.1,clientaddr=127.0.0.1)), ale acl se tam neobjevilo.
Pomocí FileStore zjistíte, zda daný souborový systém podporuje potřebné View.
Ukázka:
FileStore fileStore = Files.getFileStore(path); System.out.println("FileAttributeView supported: " + fileStore.supportsFileAttributeView(FileAttributeView.class));
Na Windows 7 pak uvidíte: FileAttributeView supported: false
Balíček java.nio dále nabízí podporu kopírování souborů, kopírování adresářů a kopírování InputStream do souboru. Pro uložení webové stránky do souboru například použijete:
Kód
... Path newFile = FileSystems.getDefault().getPath("/home/pavel/algoritmy.html"); System.setProperty("https.protocols", "TLSv1.2"); URI url = URI.create("https://www.algoritmy.net/"); try (InputStream inputStream = url.toURL().openStream()) { Files.copy(inputStream, newFile); System.out.println("Site copied successfully!"); } catch (MalformedURLException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); }
Zkopíruje webovou stránku algoritmů. Nejprve jsem však zkoušel Seznam.cz, který bez řádku s protokolem TLSv1.2 fungoval bezproblémově a naše Algoritmy.net zobrazovaly chybu. Když jsem zadával https stránky www.algoritmy.net, dostal jsem logicky Exception: javax.net.ssl.SSLException: Received fatal alert: protocol_version, takže mne překvapilo, že stránku Seznamu to okopírovalo. Nakonec jsem si uvědomil, že máme A+ od ssllabs.com a proto nepodporujeme zastaralé zabezpečení SSL. Doplnění řádku č. 3 pak bylo nasnadě. V případě Java 8 můžete tento řádek vynechat, jelikož Java 8 standardně využívá šifrování TLSv1.2
Pokud zadáme stránky bez SSL šifrování, většina již vrací přesměrování na zabezpečenou verzi.
Podpora TLS a SSL šifrování v Java verze 6, 7 a 8
JDK 8 (březen 2014 dodnes) |
JDK 7 (červenec 2011 dodnes) |
JDK 6 (2006 do konce veřejných aktualizací 2013) |
|
TLS Protokoly |
TLSv1.2 (výchozí) TLSv1.1 TLSv1 SSLv3 |
TLSv1.2 TLSv1.1 TLSv1 (výchozí) SSLv3 |
TLS v1.1 (JDK 6 aktualizace 111 a vyšší) TLSv1 (výchozí) SSLv3 |
JSSE Ciphers: |
Šifrování v JDK 8 |
Šifrování v JDK 7 |
Šifrování v JDK 6 |
Reference: |
JDK 8 JSSE | JDK 7 JSSE | JDK 6 JSSE |
V příštím díle probereme Stream IO