Nio2

980 views

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
980
On SlideShare
0
From Embeds
0
Number of Embeds
109
Actions
Shares
0
Downloads
5
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Nio2

  1. 1. nio2(JSR203)勉強会 大崎 瑶
  2. 2. nio2 • nio(JSR51)の積み残し • 非同期I/O • マルチキャストサポート • ファイルシステムインタフェース
  3. 3. ファイルシステムインタフェース
  4. 4. java.nio.file.FileSystem FileSystem fileSystem = FileSystems.getDefault(); Path path = fileSystem.getPath(“foo.txt”); FileSystemの取得 Pathの取得 List<FileSystemProvider> providers = FileSystemProvider.installedProviders(); FileSystemはFileSystemProviderによって提供される。 一覧は、installedProviders()で取得できます。
  5. 5. ディレクトリ DirectoryStream<Path> directory = Files.newDirectoryStream(path); for (Path childPath: directory) { ... } if (Files.isDirectory(path, LinkOption.NOFOLLOW_LINKS)) { ... } ディレクトリの情報はDirectoryStreamで取得できます。 DirectoryStreamはIterableをのサブインタフェース Pathがディレクトリかどうかを調べるにはFilesユーティリティを使います。
  6. 6. 入出力 Path path = ...; InputStream iStream = Files.newInputStream(path); OutputStream oStream1 = Files.newOutputStream(path); OutputStream oStream2 = Files.newOutputStream(path, StandardOpenOption.APPEND); StandardOpenOption.CREATTE StandardOpenOption.CREATE_NEW StandardOpenOption.READ StandardOpenOption.WRITE StandardOpenOption.APPEND
  7. 7. 入出力 Path path = ...; BufferedReader reader = Files.newBufferedReader(path, Charset.defaultCharset()); BufferedWriter writer1 = Files.newBufferedWriter(path, Charset.defaultCharset()); BufferedWriter writer2 = Files.newBufferedWriter(path, Charset.defaultCharset(), StandardOpenOption.APPEND); FileChannel や SeekableByteChannel といったファイルチャネルを取得することもで きます。
  8. 8. ファイル・ディレクトリの作成 Path path = fileSystem.getPath(“filename”); Files.createFile(path); path = fileSystem.getPath(“dirname”); Files.createDirectory(path); path = fileSystem.getPath(“parentdir/childdir”); Files.createDirectory(path);
  9. 9. ファイル・ディレクトリのコピー Path foo = fileSystem.getPath("foo.txt"); Path bar = fileSystem.getPath("bar.txt"); Path baz = fileSystem.getPath("baz.txt"); // ファイルのコピー Files.copy(foo, bar); // ファイルのコピー(上書きコピー) Files.copy(foo, bar, StandardCopyOption.REPLACE_EXISTING); // ファイルのコピー(属性を含む) Files.copy(foo, baz, StandardCopyOption.COPY_ATTRIBUTES); StandardCopyOption.REPLACE_EXISTING StandardCopyOption.COPY_ATTRIBUTES StandardCopyOption.ATOMIC_MOVE
  10. 10. メタデータ • Filesクラスのユーティリティメソッド – ex. Files.setOwner(),Files.getLastModifiedTime() • Files.getAttribute(),Files.setAttribute() • FileAttributeViewインタフェース
  11. 11. Filesクラスのユーティリティメソッドを 使ったメタデータの取得設定 FileTime lastModified = File.getFileLastModifiedTime(path); UserPricipal owner = File.getOwner(path); Set<PosixFilePermission> permission = File.getPosixFilePermission(path); File.setFileLastModifiedTime(path, lastModified); File.setOwner(path, owner); File.setPosixFilePermission(path, permission); UserPrincipalLookupService service = FileSystems.getDefault().getUserPrincipalLookupService(); UserPrincipal user = service.lookupPrincipalByName("ap091011"); UserPrincipalはUserPrincipalLookupServiceから取得することが出来る。
  12. 12. Files.getAttribute() Files.setAttribute() FileTime lastModified = (FileTime) File.getAttribute(path, “lastModifiedTime”); FileTime creationTime = (FileTime) File.getAttribute(path, “creationTime”); UserPrincipal owner = File.getAttribute(path, “acl:onwer”); File.setAttribute(path, “lastModifiedTime“, lastModified); File.setAttribute(path, “creationTime”, creationTime); File.setAttribute(path, “acl:owner”, owner);
  13. 13. ファイル・ディレクトリの移動・削除 // ファイルの移動 Files.move(foo, bar); // ディレクトリの移動 Files.move(dirFoo, dirBar); // ファイルの削除 Files.delete(bar); // ファイルが存在していなくても、例外をスローしない Files.deleteIfExists(foo2); ファイルの移動とディレクトの移動は同じメソッド。 同じディレクトリ内のファイル(ディレクトリ)の移動はリネーム ファイルの移動とディレクトの移動は同じメソッド。 ディレクトリの場合ディレクトリ内にファイルがあると例外がスローされる
  14. 14. FileAttributeViewインタフェース BasicFileAttributeView attrView = Files.getFileAttributeView(path, BasicFileAttributeView.class); FileTime lastModified = attrView .readAttributes().lastModifiedTime(); FileTime creationTime = attrView .readAttributes().creationTime(); attrView.setTimes(lastModified, lastAccess, creationTime); AclFileAttributeView acl = Files.getFileAttributeView(path, AclFileAttributeView.class); UserPrincipal owner = acl.getOwner();
  15. 15. java.nio.file.FileVisitor • preVisitDirectory() – ディレクトリに入る時 • postVisitDirectory() – ディレクトリから出る時 • visitFile() – ファイルの訪問時 • visitFileFailed() – ファイルの訪問に失敗した時
  16. 16. java.nio.file.WatchService Path dest = fileSystem.getPath("dest"); WatchService watcher = fileSystem.newWatchService(); dest.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY); Pathに対してWatchServiceを登録します。
  17. 17. java.nio.file.WatchService while (true) { WatchKey key = null; try { key = watcher.take(); } catch (InterruptedException ex) { break; } } ざんねんながら、自分でポーリングしなくてはなりません。 ただし、同期化してくれるので便利といえば、便利です。 書き込み途中で何かしようとしちゃう問題とか・・・
  18. 18. 非同期I/O • AsynchronousSocketChannel • AsynchronousServerSocketChannel • AsynchronousFileChannel • AsynchronousDatagramChannel SocketChannel, ServerSocketChannel, FileChannel, DatagramChannelの非同期版 それぞれのサブクラスにはなっていません
  19. 19. 非同期I/O • Future<V>インタフェースを使う方法 • java.nio.channels.CompletionHandlerを使う方 法 非同期を実現するのに2つの方法がある。
  20. 20. AsynchronousSocketChannel AsynchronousSocketChannel client = AsynchronousSocketChannel.open(); client.connect(server.getLocalAddress()).get(); Future<AsynchronousSocketChannel> acceptFuture = server.accept(); AsynchronousSocketChannel ch = acceptFuture.get(); クライアントソケットの作成 サーバー側でアクセプトしたソケット
  21. 21. AsynchronousServerSocketChannel (Future) Future<AsynchronousSocketChannel> acceptFuture = server.accept(); 接続を受け付けるまでブロックされます AsynchronousSocketChannel worker = future.get(); acept()はブロックされません。
  22. 22. AsynchronousServerSocketChannel (CompletionHandler) acept()はブロックされません。 server.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() { public void completed(AsynchronousSocketChannel ch, Void att) { ... } public void failed(Throwable exc, Void att) { ... } )}
  23. 23. AsynchronousFileChannel AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(Paths.get("myfile")); Future<Integer> readFuture = fileChannel.read(dst, pos); ByteBuffer buffer = ByteBuffer.allocate(1024); int pos = 0; while (true) { buffer.clear(); Future<Integer> future = channel.read(buffer, pos); int len = future.get(); if (len < 0) { break; } pos += len; }

×