Статьи

Некоторые примеры JSR 203

Я готовился для некоторых предстоящих Java SE 7 Предварительный просмотр презентаций , которые я делаю на нет пуха тура в Рестон, Вирджиния и Чикаго, штат Иллинойс . Я разработал несколько примеров JSR 203 (новый новый ввод / вывод JSR) и подумал, что опущу их здесь, если они будут полезны. Они основаны на последних версиях Javadoc, доступных на странице проекта (b97).

Я не ставлю здесь много контекста. Вы можете прочитать хорошо написанное резюме Эллиотта Расти Гарольда или посмотреть презентацию JavaOne . Или приходите посмотреть мои разговоры. ?

Я на самом деле сделал такой разговор около 18 месяцев назад, вернулся и посмотрел на него, и API сильно изменился с тех пор. Во многих отношениях он был значительно упрощен и консолидирован для общей выгоды. Только в последние несколько месяцев было много полировки, особенно для лучшего использования перечислений и подобных мелочей. Некоторые из этих изменений хороши, а некоторые довольно многословны в использовании.

Путь — это новый файл. Это немного больше нюансов, но Path определенно является центром нового API файловой системы. Вот некоторые основные возни с этим:

import java.nio.file.*;   

// FileSystems -> FileSystem -> Path
FileSystem fileSystem = FileSystems.getDefault();
Path homeDir = fileSystem.getPath(“/Users/amiller”);

// Shortcut with Paths helper class
Path homeDir = Paths.get(“/Users/amiller”);

// Resolve one path in terms of another
Path relativeTemp = Paths.get(“temp”);
Path absoluteTemp = relativeTemp.resolve(homeDir);

// Get relative path from a base
Path absoluteProfile = Paths.get(“/Users/amiller/.profile”);
Path relativeProfile = absoluteProfile.relativize(homeDir);
assert relativeProfile.isRelative();
assert relativeProfile.getNameCount() == 1;

 

А вот пример открытия и добавления в файл:

import java.io.*;   
import java.nio.file.*;
import static java.nio.file.StandardWatchEventKind.*;
Path journal = Paths.get("/Users/amiller/journal.txt");

OutputStream stream = journal.newOutputStream(CREATE, APPEND);

try { 

writeEntry(stream); // normal stuff
} finally {
stream.close();
}

 

Одна приятная вещь заключается в том, что копирование и перемещение встроены (долго, долго):

import java.nio.file.*;   

Path home = Paths.get("/Users/amiller");
Path secrets = home.resolve("secrets.txt");

// Steal secrets
secrets.copyTo(home.resolve("stolenSecrets.txt"));

// Hide secrets
secrets.moveTo(Paths.get("/Users/dvader/secrets.txt"));

 

Сейчас есть много поддержки для прогулочных каталогов — вот несколько внутренних и внешних версий итераторов:

Path music = Paths.get("/Users/amiller/files/music");   

// External iterator
DirectoryStream<Path> mp3s = music.newDirectoryStream(“*.mp3”);
try {
for(Path entry : mp3s)
System.out.println(entry.getName());
} finally {
mp3s.close();
}

// Internal iterator
Files.withDirectory(music, “*.mp3”, new FileAction<Path>() {
public void invoke(Path entry) {
System.out.println(entry.getName());
}
}

 

И даже существует шаблон посетителя для рекурсивного обхода каталога (с поддержкой следующих символических ссылок, проверки циклов и т. Д.)

Путь itunes = Paths.get («/ Пользователи / amiller / Музыка / iTunes / iTunes Music»);

  
public class Mp3Visitor extends SimpleFileVisitor<Path> {
private Path root;
public Mp3Visitor(Path root) {
this.root = root;
}

public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
System.out.println(root.relativize(file));
}
}

Files.walkFileTree(itunes, new Mp3Visitor(itunes));

И, конечно же, мы наконец-то получили поддержку доступа к атрибутам файлов posix как части API (и некоторых других общих наборов атрибутов и расширяемой поддержки для других подключаемых файловых систем):

Path file = Paths.get(“/usr/bin/perl”);   

// true here means follow symbolic links
BasicFileAttributes attrs = Attributes.readPosixFileAttributes(file, true);
Set<PosixFilePermission> perms = attrs.permissions();

System.out.format("%s %s %s", PosixFilePermission.toString(attrs.permissions()), attrs.owner(), attrs.group());

// rwxr-xr-x root wheel

Наконец, теперь есть поддержка общих «сервисов наблюдения» для просмотра событий файлов в каталоге (с эффективной поддержкой в ​​зависимости от платформы):

import static java.nio.file.StandardWatchEventKind.*;   
Path deploy = Paths.get(“deploy”);
WatchService watcher = FileSystems.getDefault().newWatchService();
WatchKey key = deploy.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY );

for(;;) {
key = watcher.take(); // blocks, also can poll
for(WatchEvent<?> event : key.pollEvents()) {
switch(event.kind()) {
case ENTRY_CREATE:
Path file = (Path)event.getContext(); //relative to deploy
// deploy new stuff
case ENTRY_MODIFY: ...
case ENTRY_DELETE: ...
}
}
key.reset(); // reset after processing
}

 

Если кто-нибудь обнаружит какие-либо ошибки, пожалуйста, дайте мне знать.

С http://tech.puredanger.com/