Java7 の Java.nio.file.Files で ファイルのコピーをしてみる

    はじめに

    会社では Java で SMB プロトコルをごにょごにょしているというお仕事なので, Java でファイル操作をするような I/F を調べました.

    具体的には, フォルダをコピーしたい.

    Java7 で Files というライブラリが新たらしく追加された. これが利用できそうなので, 試してみた.

    reference

    基本

    java.nio.file を import.

    import java.nio.file.*; 

    FileSystems.getDefault ();で ファイルシステムオブジェクトを取得.

    // filesystem の取得
    FileSystem fileSystem = FileSystems.getDefault ();

    ファイル or ディレクトリを表すオブジェクトは Path オブジェクトで示す. 以下のいずれかで取得.

    • fileSystem.getPath ()
    • Paths.get ()
    Path fooFile = fileSystem.getPath ("foo.txt");
    Path barFile = Paths.get ("bar.txt");

    コピーしてみる

    Files オブジェクトの copy メソッドを利用する.

    public static Path copy (Path source, Path target, CopyOption... options) throws IOException
    • source … コピー元
    • target … コピー先
    • options

      • REPLACE_EXISTING … target が存在すれば上書き
      • COPY_ATTRIBUTES … Attribute もコピー.
      • NOFOLLOW_LINKS … シンポリックリンクはコピーしない.
    Files.copy (fooFile, barFile);

    reference

    コピー

    移動

    属性の取得

    以下でできる.

    • getFileAttributeView ()
    • getFileAttribute ()
    • readFileAttirbute ()

    getFileAttributeView (), readFileAttirbute () だと, 指定した FileAttributeView オブジェクトが取得できる.

    BasicFileAttributes attrs = Files.getFileAttributeView (barFile, BasicFileAttributeView.class);
    BasicFileAttributes attrs = Files.readAttributes (barFile, BasicFileAttributes.class);

    getFileAttribute で FileAttirbuteView の個々の属性を指定して情報を取得することができる.

    Sample Code

    import java.nio.file.*;
    import java.nio.file.attribute.*;
    
    public class FilesSample {
        public static void main (String args[]) {
            try {
    
                // file system
                FileSystem fileSystem = FileSystems.getDefault ();
    
                // ファイルを表す Path オブジェクトを生成
                Path fooFile = fileSystem.getPath ("foo.txt");
                System.out.println (fooFile);
                Path barFile = Paths.get ("bar.txt");
                System.out.println (barFile);
    
                // ファイルが存在する場合は削除します
                Files.deleteIfExists (barFile);
    
                // copy
                Files.copy (fooFile, barFile);
    
                // 存在チェック
                if (!Files.exists (barFile)) 
                    System.out.println ("file not exist");
    
                // 容量チェック
                if (Files.size (barFile) != Files.size (barFile) ) 
                    System.out.println ("file size is not equal");
    
                BasicFileAttributes attrs = Files.getFileAttributeView (barFile, BasicFileAttributeView.class);
                BasicFileAttributes attrs = Files.readAttributes (barFile, BasicFileAttributes.class);
    
            } catch (Exception ex) {
                System.out.println (ex);
            }
        }
    }

    つづき