Javaファイル – java.nio.file.Filesクラス

Java FilesクラスはJava 1.7で導入され、java.nio.fileパッケージの一部です。

JavaのFilesクラス

java Files class, java NIO Files
  • Java Files class contains static methods that work on files and directories.
  • This class is used for basic file operations like create, read, write, copy and delete the files or directories of the file system.

前に進む前に、まず以下の用語に目を通してみましょう。

    1. パス:Java NIOで作業する際に、ファイルやディレクトリの表現として、java.io.Fileクラスの代わりとなるインターフェイスです。

 

    パス:このクラスには、Pathインスタンスを作成するための静的メソッドが含まれています。
java file path, Java NIO Files Paths

Java IOとNIOの比較

Java IO vs NIO

パスを作成する方法

PathsクラスのPaths.get(String first, String… more)メソッドを呼び出すことで、Pathのオブジェクトを作成することができます。

Path path1 = Paths.get("/tmp/file.txt"); // For UNIX

Path path2 = Paths.get("D:/data/file.txt"); // For Windows

パスの部分を分割することで、Paths.get() メソッドで Path オブジェクトも作成することができます。

Path path1 = Paths.get("/tmp", "file.txt");

Path path2 = Paths.get("D:", "data", "file.txt");

Path path3 = Paths.get("D:/data", "file.txt") ;

私たちが見るように、Paths.get()メソッドでフォルダ名とファイル名を別々に渡すことができます。

Javaのファイルのメソッド

JavaのNIOのFilesクラスには、ファイルやディレクトリを操作するために使用される静的メソッドが含まれており、それらのメソッドのほとんどはPathオブジェクトで動作します。以下にFilesクラスのメソッドをご紹介しましょう。

    1. copy(InputStream in, Path target, CopyOption… options):

 

    1. このメソッドは、指定された入力ストリームのすべてのバイトを指定されたターゲットファイルにコピーし、読み込まれたまたは書き込まれたバイト数をlong値で返します。

copy(Path source, OutputStream out):
このメソッドは、指定されたソースファイルのすべてのバイトを指定された出力ストリームにコピーし、読み込まれたまたは書き込まれたバイト数をlong値で返します。

copy(Path source, Path target, CopyOption… options):
このメソッドは、指定されたソースファイルを指定されたターゲットファイルにコピーし、ターゲットファイルのパスを返します。

createDirectories(Path dir, FileAttribute<?>… attrs):
このメソッドは、指定されたパスを使用して存在しない親ディレクトリをすべて作成し、ディレクトリを作成します。既に存在するディレクトリを作成できない場合、例外はスローされません。FileAttributeは、存在しないディレクトリを作成する際に自動的に設定するためのオプションのパラメータであり、作成されたディレクトリのパスを返します。

createDirectory(Path dir, FileAttribute<?>… attrs):
このメソッドは、指定されたパスでディレクトリを作成し、ディレクトリの作成に成功した場合は作成されたディレクトリのパスを返します。ディレクトリが既に存在している場合は、nio.file.FileAlreadyExistsExceptionがスローされます。

createFile(Path path, FileAttribute<?>… attrs):
このメソッドは、指定されたパスで新規の空のファイルを作成し、作成に成功した場合は新しく作成されたファイルのパスを返します。ファイルが既に存在している場合は、nio.file.FileAlreadyExistsExceptionがスローされます。

createTempDirectory(Path dir, String prefix, FileAttribute<?>… attrs):
このメソッドは、指定されたパスを使用して一時ディレクトリを作成し、指定されたプレフィックスを使用してディレクトリの名前を生成します。新しく作成された一時ディレクトリのパスを返します。

createTempDirectory(String prefix, FileAttribute<?>… attrs):
このメソッドは、デフォルトの一時ファイルディレクトリに一時ディレクトリを作成し、指定されたプレフィックスを使用してディレクトリの名前を生成します。デフォルトのファイルシステムに関連付けられた新しく作成された一時ディレクトリのパスを返します。

createTempFile(Path dir, String prefix, String suffix, FileAttribute<?>… attrs):
このメソッドは、指定されたディレクトリに一時ファイルを作成し、指定されたプレフィックスとサフィックスを使用してファイル名を生成し、新しく作成されたファイルのパスを返します。

createTempFile(String prefix, String suffix, FileAttribute<?>… attrs):
このメソッドは、デフォルトの一時ファイルディレクトリに一時ファイルを作成し、指定されたプレフィックスとサフィックスを使用してファイル名を生成し、新しく作成されたファイルのパスを返します。

delete(Path path):
このメソッドは、指定されたパスのファイルを削除します。ファイルが指定されたパスに存在しない場合は、NoSuchFileExceptionをスローします。ファイルがディレクトリであり、空でない場合や削除できない場合には、スローされます。

deleteIfExists(Path path):
このメソッドは、ファイルを削除する前にファイルが存在するかどうかを確認し、ファイルが指定されたパスで正常に削除された場合はtrueを返し、ファイルが指定されたパスに存在しない場合はfalseを返します。ファイルがディレクトリであり、空でない場合や削除できない場合には、スローされます。

exists(Path path):
このメソッドは、指定されたパスにファイルが存在するかどうかを確認し、ファイルが存在する場合はtrueを返し、存在しない場合はfalseを返します。

getLastModifiedTime(Path path, LinkOption… options):
このメソッドは、指定したパスのファイルの最終更新日時を返します。

getOwner(Path path, LinkOption… options):
このメソッドは、指定したパスのファイルの所有者を表すUserPrincipalを返します。

isDirectory(Path path, LinkOption… options):
このメソッドは、指定されたパスからファイルがディレクトリであるかどうかを確認します。ファイルがディレクトリである場合はtrueを返し、ファイルが存在しないかディレクトリでない場合はfalseを返します。

isExecutable(Path path):
このメソッドは、指定されたパスのファイルが実行可能かどうかを確認し、ファイルが存在し、このJVMがファイルを実行するための適切な権限を持っている場合にtrueを返します。ファイルが存在しないか、JVMに実行ファイルを実行するための十分な特権がない場合、またはアクセスが判定できない場合にはfalseを返します。

isHidden(Path path):
このメソッドは、指定されたパスのファイルが非表示とされるかどうかを示します。非表示の定義はプラットフォームやプロバイダに依存します。UNIXシステムの場合、ファイルの名前がピリオド文字(’.’)で始まる場合、非表示とされます。Windowsの場合、ディレクトリではなくDOSの非表示属性が設定されている場合、非表示とされます。指定されたパスのファイルが非表示とされる場合はtrueを返し、そうでない場合はfalseを返します。

isReadable(Path path):
このメソッドは、指定されたパスのファイルが読み取り可能かどうかをテストします。指定されたパスのファイルが存在し、読み取り可能な場合はtrueを返し、ファイルが存在しないか、読み取りアクセスが拒否されている場合、またはアクセスが判断できない場合はfalseを返します。

isWritable(Path path):
このメソッドは、指定されたパスのファイ

Filesクラスを使用して、ファイルを作成する。

Filesクラスには、指定されたパスを使用してファイルを作成するためのcreateFile(Path filePath, FileAttribute<?>… attrs)メソッドが用意されています。以下の例プログラムを見てみましょう。

package com.scdev.examples;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * Java Create file using Files class
 * 
 * @author scdev
 *
 */
public class FilesCreateFileExample {

	public static void main(String[] args) {
		
		//initialize Path object
		Path path = Paths.get("D:/data/file.txt");
		//create file
		try {
			Path createdFilePath = Files.createFile(path);
			System.out.println("File Created at Path : "+createdFilePath);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

上記のプログラムの出力は以下の通りです。 (Jōki no puroguramu no shutsuryoku wa ika no tōri desu.)

File Created at Path : D:\data\file.txt

ファイルクラスを使用してディレクトリを作成する

Filesクラスには、指定されたパスを使用して単一および複数のレベルのディレクトリを作成するためのcreateDirectory(Path dir, FileAttribute<?>… attrs)およびcreateDirectories(Path dir, FileAttribute<?>… attrs)メソッドが提供されています。以下の例プログラムを見てみましょう。

package com.scdev.examples;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * Java Create directories using Files class
 * 
 * @author scdev
 *
 */
public class FilesCreateDirectoriesExample {

	public static void main(String[] args) {
		// initialize Path objects
		Path path1 = Paths.get("D:/scdev");
		Path path2 = Paths.get("D:/scdev/java7");
		Path path3 = Paths.get("D:/scdev/java7/Files");
		
		try {
			Path createdDir1 = Files.createDirectory(path1);//first level directory
			Path createdDir2 = Files.createDirectory(path2);//second level directory
			Path createdDir3 = Files.createDirectory(path3);//all level directories
			System.out.println("First Level Directory Created at Path : "+createdDir1);
			System.out.println("Second Level Directory Created at Path : "+createdDir2);
			System.out.println("All Level Directories Created at Path : "+createdDir3);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

上記のプログラムの出力は以下の通りです。

First Level Directory Created at Path : D:\scdev
Second Level Directory Created at Path : D:\scdev\java7
All Level Directories Created at Path : D:\scdev\java7\Files

ファイルをパスに変換し、逆にパスをファイルに変換する。

ファイルとパスのオブジェクトは、以下の方法を使用して互いに変換することができます。

File file = new File(“D:/data/file.txt”);

Path path = file.toPath();

File file1 = path.toFile();

Filesクラスを使用してファイルデータを読み取る。

Filesクラスは、ファイルを読み込むための以下のメソッドを提供します。

    1. readAllBytes(Path path): このメソッドは、指定されたパスのファイルからすべてのバイトを読み込み、読み込まれたバイトを含むバイト配列を返します。

 

    readAllLines(Path path,Charsetcs): このメソッドは、指定されたパスのファイルからすべての行を読み込み、ファイルの行を含むリストを返します。

以下の例プログラムを見てみましょう。

package com.scdev.examples;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

/**
 * Java Files read file example
 * 
 * @author scdev
 *
 */
public class FilesReadFileExample {

	public static void main(String[] args) {
		
		Path path = Paths.get("D:/data/file.txt");
		try {
			byte[] bs = Files.readAllBytes(path);
			List<String> strings = Files.readAllLines(path);
			
			System.out.println("Read bytes: \n"+new String(bs));
			System.out.println("Read lines: \n"+strings);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

上記のプログラムの出力は以下の通りです。

Read bytes: 
Hello world
This is Read file example
Thank you
Read lines: 
[Hello world, This is Read file example, Thank you]

Filesクラスを使用してファイルをコピーする

以下のような例のプログラムを見てみましょう。 Filesクラスのcopy(Path source, Path target, CopyOption… options)メソッドは、指定されたソースファイルを指定されたターゲットファイルにコピーし、ターゲットファイルのパスを返します。

package com.scdev.examples;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

/**
 * Java Files copy file example
 * 
 * @author scdev
 *
 */
public class FilesCopyFileExample {

	public static void main(String[] args) {
		Path sourcePath = Paths.get("D:/data/sourceFile.txt");
		Path targetPath = Paths.get("D:/data/targetFile.txt");
		
		try {
			Path path = Files.copy(sourcePath, targetPath,StandardCopyOption.REPLACE_EXISTING);//copy with REPLACE_EXISTING option
			System.out.println("Target file Path : "+path);
			System.out.println("Copied Content : \n"+new String(Files.readAllBytes(path)));
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

上記のプログラムの出力結果は以下の通りです。

Target file Path : D:\data\targetFile.txt
Copied Content : 
Hello world
This is Copy file example
Thank you

Files クラスを使用してファイルを移動

JavaのFilesクラスは、move(Path source, Path target, CopyOption… options) メソッドを提供しています。このメソッドは、ソースファイルをターゲットファイルに移動または名前を変更し、ターゲットファイルのパスを返します。オプションのパラメータには、次のようなものが含まれることがあります:REPLACE_EXISTING:これは、ターゲットファイルが存在する場合、それが空でないディレクトリでない限り、それを置き換えます。ATOMIC_MOVE:これは、移動がアトミックなファイルシステム操作として行われ、他のすべてのオプションは無視されます。このメソッドは、ターゲットファイルが存在するが、REPLACE_EXISTINGオプションが指定されていないために置き換えることができない場合に、FileAleadyExistsExceptionをスローします。また、このメソッドは、REPLACE_EXISTINGオプションが指定されているが、ファイルが空でないディレクトリであるために置き換えることができない場合に、DirectoryNotEmptyExceptionをスローします。以下の例プログラムを見てみましょう。

package com.scdev.examples;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

/**
 * Java Files move file example
 * 
 * @author scdev
 *
 */
public class FilesMoveFileExample {

	public static void main(String[] args) {
		Path sourcePath = Paths.get("D:/data/sourceFile.txt");
		Path targetPath = Paths.get("D:/data/targetFile.txt");
		try {
			Path path = Files.move(sourcePath, targetPath,StandardCopyOption.REPLACE_EXISTING);//move with REPLACE_EXISTING option
			System.out.println("Target file Path : "+path);
			System.out.println("Moved Content : \n"+new String(Files.readAllBytes(path)));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

ファイルをFilesクラスを使用して書き込む。

JavaのNIOのFilesクラスには、指定されたパスにバイトを書き込むwrite(Path path, byte[] bytes, OpenOption… options)メソッドがあります。optionsパラメータは、ファイルの作成方法やオープン方法を指定します。オプションが指定されていない場合、デフォルトではCREATE、TRUNCATE_EXISTING、WRITEのオプションが考慮されます。これは、ファイルを書き込むために開き、ファイルが存在しない場合は作成し、すでに存在する場合はサイズを0に切り詰めます。バイト配列のすべてのバイトがファイルに書き込まれます。このメソッドは、すべてのバイトが書き込まれた後にファイルを閉じ、書き込まれたファイルのパスを返します。

package com.scdev.examples;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * Java Files write file example
 * 
 * @author scdev
 *
 */
public class FilesWriteFileExample {

	public static void main(String[] args) {
		Path path = Paths.get("D:/data/test.txt");
		try {
			String str = "This is write file Example";
			byte[] bs = str.getBytes();
			Path writtenFilePath = Files.write(path, bs);
			System.out.println("Written content in file:\n"+ new String(Files.readAllBytes(writtenFilePath)));
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

ファイルツリーを探索する

Filesクラスは、指定したパスを再帰的にトラバースしてディレクトリ内を移動するためのwalkFileTree(Path start, FileVisitor<? Super Path> visitor)メソッドを提供しています。このメソッドは、指定されたパスのディレクトリをトラバースし、開始ファイルを返します。

package com.scdev.examples;

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;

/**
 * Java Files walk file tree example
 * 
 * @author scdev
 *
 */
public class FilesWalkFileTreeExample {

	public static void main(String[] args) {
		Path path = Paths.get("D:/scdev");
		try {
			Files.walkFileTree(path, new FileVisitor<Path>() {

				@Override
				public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
					System.out.println("Post Visit Directory: "+dir);
					return FileVisitResult.CONTINUE;
				}

				@Override
				public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
					System.out.println("Pre Visit Directory: "+dir);
					return FileVisitResult.CONTINUE;
				}

				@Override
				public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
					System.out.println("Visit File: "+file);
					return FileVisitResult.CONTINUE;
				}

				@Override
				public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
					System.out.println("Visit Failed File: "+file);
					return FileVisitResult.CONTINUE;
				}
			});
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

上記のプログラムの出力は以下の通りです。

Pre Visit Directory: D:\scdev
Pre Visit Directory: D:\scdev\java6
Pre Visit Directory: D:\scdev\java6\Files
Visit File: D:\scdev\java6\Files\file.txt.txt
Post Visit Directory: D:\scdev\java6\Files
Post Visit Directory: D:\scdev\java6
Pre Visit Directory: D:\scdev\java7
Pre Visit Directory: D:\scdev\java7\Files
Visit File: D:\scdev\java7\Files\file.txt.txt
Post Visit Directory: D:\scdev\java7\Files
Post Visit Directory: D:\scdev\java7
Pre Visit Directory: D:\scdev\java8
Pre Visit Directory: D:\scdev\java8\Files
Visit File: D:\scdev\java8\Files\file.txt.txt
Post Visit Directory: D:\scdev\java8\Files
Post Visit Directory: D:\scdev\java8
Post Visit Directory: D:\scdev

すべてのファイルやフォルダが再帰的に処理されることに注意してください。これは、ディレクトリ内のすべてのファイルの名前を一括で変更するなど、全ファイルに共通の処理を行いたい場合に非常に便利です。これでJavaのFilesクラスに関する説明は終わりです。参照:APIドキュメント

コメントを残す 0

Your email address will not be published. Required fields are marked *