OZ 2011/1-2

36 ORGANIZACIJA ZNANJA 2011, LETN. 16, ZV. 1 – 2 DATOTE^NI SISTEM Nova verzija programskega vmesnika za javo bo prinesla veliko izboljšav pri dostopu do datotečnega sistema FS (angl. file system ), kar bo odpravilo dosedanje pomanjkljivosti pri uporabi paketa java.io , kot so: • nekonsistenca med različnimi računalniškimi okolji, • pri napakah pri dostopu so vržene izjeme neuporabne pri odkrivanju napak, • ni podpore za osnovne operacije, kot so kopiranje in premikanje datotek, • omejena podpora za simbolične povezave, • omejena podpora za atribute datotek, pravice dostopa …, • problemi zaradi zmogljivosti itd. Za dostop do datotečnega sistema ( FS ) so dodali nove pakete java.nio.file , java.nio.file.attribute in java. nio.file.spi . Osnovni razred postaja java.nio.file.Path , ki nadomešča stari java.io.File . Datotečni sistem je predstavljen z vmesnikom java.nio.file.FileSystem , medtem ko FileStore naslavlja konkreten datotečni sistem , diske ... Razred Path definiramo podobno kot razred File, dodano pa mu je mnogo novih metod. Dostop do datoteke za branje: Path file = Paths.get("myFile"); InputStream in = file.newInputStream(); Pisanje v datoteko: import static java.nio.file. StandardOpenOption.*; Path file = … OutputStream out = file. newOutputStream(CREATE, TRUNCATE_ EXISTING); Možno je določiti atribute oz. privilegije pri kreiranju datoteke: Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rw-r--- --"); Set<OpenOption> opts = EnumSet. of(CREATE_NEW, WRITE); OutputStream out = ... file.newOutputStream(opts, PosixFilePermissions.asFileAttribute(perms)); Zelo uporabna možnost, ki jo pogrešamo danes, je kopiranje datotek: Path source = … Path target = … source.copyTo(target, REPLACE_EXISTING, COPY_ATTRIBUTES); source.moveTo(target); Preko razreda FileChanel je omogočeno iskanje po datotekah, asinhrono branje in pisanje, zaklepanje datotek ... Razred DirectoryStream omogoča zelo hitro sprehajanje po drevesni strukturi, pri čemer porabi malo sistemskih virov. Vgrajeno ima filtriranje po vzorcih GLOB in REGEX ter možnost uporabe lastnih filtrov. Primer sprehajanja z uporabo filtra: Path dir = … try (DirectoryStream<Path> stream = dir. newDirectoryStream("*.java")) { for (Path entry: stream) { System.out.println(entry.getName()); } } Ali: Path dir = … DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() { public boolean accept(Path entry) { ... } } try (DirectoryStream<Path> stream = dir. newDirectoryStream(filter)) { for (Path entry: stream) { System.out.println(entry.getName()); } } Files.walkFileTree je vgrajeni iterator, ki omogoča sprehajanje po drevesni strukturi. Določimo mu začetno točko ter poslušalce (angl. listener ), ki izvedejo operacije glede na trenutni imenik oz. datoteko: interface FileVisitor<T> { FileVisitResult preVisitDirectory (T dir, BasicFileAttributes attrs); FileVisitResult visitFile(T file, BasicFileAttributes attrs); FileVisitResult vistFileFailed (T file, IOException ioe); FileVisitResult postVisitDirectory (T dir, IOException ioe); } POROČILO

RkJQdWJsaXNoZXIy MTAxMzI5