きしだのはてな このページをアンテナに追加 RSSフィード

2011-07-07(木) Java SE 7のjava.nio.file.Filesがとても便利な件

Java SE 7のjava.nio.file.Filesがとても便利な件 18:36 Java SE 7のjava.nio.file.Filesがとても便利な件を含むブックマーク

とても便利。

たとえば、あるサイトからHTMLをダウンロードしてファイルに保存する場合。

try(InputStream is = new URL("http://www.google.com/").openStream()){
    Files.copy(is, Paths.get("C:\\Users\\kishida\\Downloads\\google.html"));
}

ファイルの内容を一行ずつ読み込んで処理をする場合。

for(String s : Files.readAllLines(Paths.get("C:\\Install.log"), Charset.defaultCharset())){
    System.out.println(s);
}

まあ、直接文字列でファイルパスを渡せなかったり、デフォルトCharset使う場合でも引数が省略できなくて、まだるっこいコードになってしまうところは、あいかわらずJavaらしいけど。


あと、あるパス以降のディレクトリを全部たどってファイルを処理する場合。

Files.walkFileTree(Paths.get("C:\\Users\\kishida\\Desktop"), new SimpleFileVisitor<>(){
    @Override
    public FileVisitResult visitFile(Object file, BasicFileAttributes attrs) throws IOException {
        Path p = (Path) file;
        System.out.println(p.toString());
        return super.visitFile(file, attrs);
    }
});

ということで、「Javaってファイル扱うのにこんなめんどいコードが必要なのにRuby/Groovy/Scalaなら一発!」みたいなコード比較で、ちょっとだけJava側の行数が減ります。

ほかにもFilesクラスのメソッド眺めてみると楽しいと思います。

dokushadokusha 2011/07/07 23:21 試してないのであれですけど多分使い方的にSimpleFileVisitor<Path>ってしてvisitFile(Path file,...で受ければキャストしなくていいのでは?

nowokaynowokay 2011/07/08 02:17 あ、なるほど。
このコードもtoStringしてるだけなので、実際はキャスト不要なんですけど、Pathが来てるよって明示するためにやってました。