More Related Content Similar to NIO.2を使って簡単ファイル操作 (20) More from Yuichi Sakuraba (20) NIO.2を使って簡単ファイル操作2. Agenda
JSR 51 New I/O APIs
JSR 203 More New I/O APIs
New Filesystem API
Conclusion
3. JSR 51 New I/O APIs
Buffer/Direct Buffer
Channel
Non-Blocking I/O
Charset
Regular Expression
Mark Reinhold
4. JSR 51 New I/O APIs
Buffer/Direct Buffer
り !
あ
Channel
し
残
Non-Blocking I/O
み
積 Charset
Regular Expression
Mark Reinhold
5. An API for scalable I/O operations
on both files and sockets, in the form of
either asynchronous requests
or polling
A new filesystem interface that supports
bulk access to file attributes (including MIME content types),
escape to filesystem-specific APIs,
and a service-provider interface for pluggable filesystem
implementations.
Mark Reinhold
6. JSR 203 More New I/O APIs
Asynchronous I/O
New Filesystem Interface
Multicast with SocketChannel
Alan Bateman
7. コピーなどの基本操作
Why Now?
foo.txt
作成日などのメタデータ ディレクトリの探索
9. Instantiation
// 物理的なファイルシステム
FileSystem fileSystem = FileSystems.getDefault();
// foo.txt に対応するパスの生成
Path foo = fileSystem.getPath("foo.txt");
// baz/bar/foo.txt に対応するパスの生成
Path foo2 = fileSystem.getPath("baz", "bar", "foo.txt");
// foo.txt に対応するパスの簡易的な生成
Path foo3 = Paths.get("foo.txt");
10. Instantiation
FileSystem fileSystem = FileSystems.getDefault();
Path jarfile = fileSystem.getPath("someapp.jar");
// someapp.jar に対応する FileSystem オブジェクトを取得する
FileSystem jarFileSystem
= FileSystems.newFileSystem(jarfile,
ClassLoader.getSystemClassLoader());
<< 処理 >>
// クローズ
jarFileSystem.close();
11. Conversion
File file = ...;
// File から Path
Path path = file.toPath();
// Path から File
File file2 = path.toFile();
12. Creation
// 空のファイルを生成
Path path = fileSystem.getPath("foo.txt");
Files.createFile(path);
// ディレクトリを生成
Path dir = fileSystem.getPath("bar");
Files.createDirectory(dir);
// ディレクトリツリーを生成
Path dir2 = fileSystem.getPath("baz", "quux");
Files.createDirectories(dir2);
13. Link Creation
// ハードリンクの作成
Path target = fileSystem.getPath("foo.txt");
Path link = fileSystem.getPath("bar.txt");
Files.createLink(link, target);
// シンボリックリンクの生成
Path symLink = fileSystem.getPath("baz.txt");
Files.createSymbolicLink(symLink, target);
14. Operations
Path src = fileSystem.getPath(...);
Path dest = fileSystem.getPath(...);
// File Copy
Files.copy(src, dest);
// Move
Files.move(src, dest);
// Delete
Files.delete(dest);
Files.deleteIfExists(dest);
15. Input/Output
Path path = ...; Charset charset = ...;
// Reader/Wirter
BufferedReader reader
= Files.newBufferedReader(path, charset);
BufferedWriter writer
= Files.newBufferedWriter(path, charset);
// Stream
InputStream iStream = Files.newInputStream(path);
OutputStream oStream = Files.newOutputStream(path);
// Channel
SeekableByteChannel channel = Files.newByteChannel(path);
16. Simple Input/Output
Path path = ...; Charset charset = ...;
// 簡易入力
byte[] bytes = Files.readAllBytes(path);
List<String> lines = Files.readAllLines(path, charset);
// 簡易出力
Files.write(path, bytes);
Files.write(path, lines, charset);
18. Two ways
for dealing with Metadata
Calling
Files methods
Through
AttributeView
interface
19. Metadata
Path path = ...;
// オーナー
UserPrincipal owner = Files.getOwner(path);
// 最終更新日時
FileTime modifyDate = Files.getLastModifiedTime(path);
// 作成日時
FileTime creatDate
= (FileTime)Files.getAttribute(path,
"creationTime");
20. AttributeView
<<interface>> <<interface>>
AttributeView FileAttributeView
<<interface>>
BasicFileAttributeView
<<interface>>
AclFileAttributeView
<<interface>>
FileOwnerAttributeView
<<interface>> <<interface>>
DosFileAttributeView PosixFileAttributeView
21. AttributeView
Path path = ...;
BasicFileAttributeView view
= Files.getFileAttributeView(path,
BasicFileAttributeView.class);
// アトリビュートを保持するのは BasicFileAttribute
BasicFileAttributes attributes
= view.readAttributes();
// アトリビュートの取得
FileTime creationTime = attributes.creationTime();
FileTime lastAccessTime = attributes.lastAccessTime();
24. 1. preVisitDirectory alpha 11. postVisitDirectory
2. preVisitDirectory
bravo 8. preVisitDirectory charlie 10. postVisitDirectory
7. postVisitDirectory
3. visitFile bar.txt delta baz.txt 9. visitFile
4. preVisitDirectory 6. postVisitDirectory
<<interface>>
foo.txt
FileVisitor
5. visitFile preVisitDirectory
postVisitDirectory
visitFile
visitFileFailed
25. File Search
Path startDir = Paths.get(".");
final String regex = "Test.java";
Files.walkFileTree(startDir,
new SimpleFileVisitor<Path>() {
public FileVisitResult visitFile(Path path,
BasicFileAttributes attrs) {
if (Pattern.matches(regex,
path.getFileName().toString())) {
System.out.println("File: " + path);
}
return FileVisitResult.CONTINUE;
}
});
27. Directory Watch
Path targetDir = fileSystem.getPath(...);
// WatchService オブジェクトの生成
WatchService watcher = fileSystem.newWatchService();
// ディレクトリに WatchService オブジェクトを登録
targetDir.register(watcher,
StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY);
28. Directory Watch
while(...) {
// 現在のイベントを取得
WatchKey key = watcher.take();
for (WatchEvent<?> event: key.pollEvents()) {
// イベントの種類と対象となるパスを出力
System.out.println(event.kind()
+ " " + event.context());
}
key.reset();
}
29. Conclusion
JSR 203 More New I/O
New Filesystem Interface
Asyn I/O
Multicast
New Filesystem Interface
foo.txt
30. References
ITpro Java SE 7 徹底理解
第 4 回 New I/O 2 の
新しいファイルシステムインタフェース その 1
http://itpro.nikkeibp.co.jp/article/COLUMN/20110725/362803/
第 5 回 New I/O 2 の
新しいファイルシステムインタフェース その 2
http://itpro.nikkeibp.co.jp/article/COLUMN/20110830/367909/
第 6 回 New I/O 2 で非同期 I/O
http://itpro.nikkeibp.co.jp/article/COLUMN/20110927/369451/