2016年1月9日土曜日

[NIO2]を使ってZipファイルの読み込みを行う

試してみたのは、郵便番号CSV?をダウンロードしてきて、zip内のcsvデータを標準出力するもの。

NIO2では、zipファイルを仮想ファイルシスムとして扱えるので、Files.walkFileTreeでzip内のファイルだけを対象にした処理を簡単に実装できる。


// zipのダウンロード
String url = "http://www.post.japanpost.jp/zipcode/dl/oogaki/zip/10gumma.zip";
final Path zip = Paths.get("10gumma.zip");
try (InputStream stream = new URL(url).openStream()) {
    Files.copy(stream, zip, StandardCopyOption.REPLACE_EXISTING);
}

// zip内のcsvデータを標準出力に出力
try (FileSystem fileSystem = FileSystems.newFileSystem(zip, null)) {
    Files.walkFileTree(fileSystem.getPath("/"), new SimpleFileVisitor() {
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
            try (BufferedReader reader = Files.newBufferedReader(file, Charset.forName("windows-31j"))) {
                reader.lines().forEach(System.out::println);
            }
            return FileVisitResult.CONTINUE;
        }
    });
}