Я готовился для некоторых предстоящих 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
}
Если кто-нибудь обнаружит какие-либо ошибки, пожалуйста, дайте мне знать.