はじめに
会社では Java で SMB プロトコルをごにょごにょしているというお仕事なので, Java でファイル操作をするような I/F を調べました.
具体的には, フォルダをコピーしたい.
Java7 で Files というライブラリが新たらしく追加された. これが利用できそうなので, 試してみた.
reference
- Files (Java Platform SE 7 )
- Java ファイル関連メモ 2 (Hishidama’s Java Files Memo)
- Java SE 7 徹底理解 第 4 回 New I/O 2 の新しいファイルシステムインタフェース その 1:ITpro
- Java SE 7 徹底理解 第 5 回 New I/O 2 の新しいファイルシステムインタフェース その 2:ITpro
- Java SE 7 の java.nio.file.Files がとても便利な件 - きしだのはてな
- java.nio.file.Files のメソッドを一通り使ってみた - kagamihoge の日記
- これからの「 Java I/O 」の話をしよう www (5) : Files クラスのメソッド 〜ファイル内容の読み書き〜 - 倭マン’s BLOG
基本
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
コピー
- (3/7) Java 技術最前線 - Java SE 7 徹底理解 第 5 回 New I/O 2 の新しいファイルシステムインタフェース その 2:ITpro
- Java 7 新機能 3 ファイルコピー - Qiita
移動
属性の取得
以下でできる.
- getFileAttributeView ()
- getFileAttribute ()
- readFileAttirbute ()
getFileAttributeView (), readFileAttirbute () だと, 指定した FileAttributeView オブジェクトが取得できる.
BasicFileAttributes attrs = Files.getFileAttributeView (barFile, BasicFileAttributeView.class);
BasicFileAttributes attrs = Files.readAttributes (barFile, BasicFileAttributes.class);
getFileAttribute で FileAttirbuteView の個々の属性を指定して情報を取得することができる.
- FileAttributeView (Java Platform SE 7 )
- Obtaining and modifying the metadata of the files in Java 7 NIO.2
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);
}
}
}