はじめに

会社では 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);
        }
    }
}

つづき