検索

キーワード


【Java】java.nio.fileパッケージの使用例③(ファイル属性の取得・変更)

  • 公開日:2021-05-02 23:31:38
  • 最終更新日:2021-05-02 23:38:00
【Java】java.nio.fileパッケージの使用例③(ファイル属性の取得・変更)

当記事では、java.nio.fileパッケージを用いてファイル属性を取得・変更する方法について、Java SE 11 Goldを取得している著者が解説します。

ファイル属性とは、ファイルの種類、サイズ、作成日時、更新日時などの情報(これらの情報は、よくメタデータと呼ばれます)のことです。java.nio.fileパッケージではこれらの情報を取得・変更を行うためのクラスとメソッドが用意されています。

当記事でのサンプルコードは、前記事で作成したファイル名を元に記述していますが、適当なファイルを用意しても構いません。


java.nio.fileパッケージの概要について知りたい方は、以下の記事を参照して下さい。

【Java】Pathオブジェクトを生成する方法(java.nio.fileパッケージ)

また、基本的なファイル操作は以下の記事で解説します。

【Java】java.nio.fileパッケージの使用例①(ファイルの作成、存在チェック)

【Java】java.nio.fileパッケージの使用例②(移動・コピー、削除)

FileChannelを使ったファイルのコピーは、以下の記事で解説します。

【Java】FileChannelを使って高速にファイル入出力を行ってみた


ファイル属性の取得

ファイル属性の取得には、FileStoreクラスFilesクラスのメソッドを使います。


FileStoreクラス

ファイル名や書き込み権限などのファイル属性を取得するには、FileStoreクラスを使います。ファイルストアとは、ファイルシステムやメタデータを含むファイルの実データを配置してある場所という意味です。

FileStoreクラスを呼び出すには、FilesクラスgetFileStoreメソッドを使います。記述例は以下の通りです。

//FileSystemオブジェクトを取得
FileSystem fileSystem = FileSystems.getDefault();

//ファイルストアを取得したい対象であるファイルのPathオブジェクトを取得する
Path path = fileSystem.getPath("ファイルのパス名");

//Files.getFileStoreメソッドで対象ファイルのFileStoreオブジェクトを取得
FileStore fileStore = Files.getFileStore(path);


FileStoreクラスは、以下のようなメソッドを持ちます。

メソッド名返り値の型説明
name()Stringファイルシステムの名前を返します。
type()StringFAT32、FAT16、NTFSなど、ファイルシステムの種類を返します。
toString()Stringドライブの名前を返します。
isReadOnly()booleanこのファイルが読み取り専用であるかどうかを判定します。
supportsFileAttributeView​(Class<? extends FileAttributeView> type)boolean引数に「DosFileAttributeView.class」を指定するとDos系のファイルシステム(主にWindows)をサポートするかどうか、「PosixFileAttributeView.class」を指定するとposix系のファイルシステム(主にMacOS)をサポートするかどうか判定します。


FileStoreクラスのサンプルコード

以下のサンプルコードは、カレントディレクトリに「sample.txt」という名前のファイルがあることを前提に記述しています。

public class getAttribute {
	public static void main(String[] args) {
		
		//FileSystemオブジェクトを取得
		FileSystem fileSystem = FileSystems.getDefault();
		
		//FileStoreオブジェクトを取得するファイルのPathオブジェクトを取得する
		Path path = fileSystem.getPath("./sample.txt");

		try {
			//対象ファイルのFileStoreオブジェクトを取得
			FileStore fileStore = Files.getFileStore(path);
			
			//FileStoreクラスが持つメソッドを実行
			System.out.println("ファイル名: " + fileStore.name());
			System.out.println("ファイルシステムの種類 " + fileStore.type());
			System.out.println("ドライブ名: " + fileStore.toString());
			System.out.println("読み取り専用かどうか: " + fileStore.isReadOnly());
			System.out.println("Dos系のファイルシステムかどうか: " + fileStore.supportsFileAttributeView(DosFileAttributeView.class));
			System.out.println("Posix系のファイルシステムかどうか: " + fileStore.supportsFileAttributeView(PosixFileAttributeView.class));

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


FileStoreクラスのサンプルコードの実行結果

実行環境によって結果は異なりますが、上記のサンプルコードを実行すると著者の環境では以下のように出力されます。

ファイル名: Windows
ファイルシステムの種類 NTFS
ドライブ名: Windows (C:)
読み取り専用かどうか: false
Dos系のファイルシステムかどうか: true
Posix系のファイルシステムかどうか: false


Filesクラス

ファイルの所有者や大きさ、最終更新日時などを知りたい場合は、Filesクラスのメソッドを使用します。
Filesクラスのメソッドのうち、属性を取得するものには主に以下のようなものがあります。

メソッド名返り値の型説明
getOwner(Path path, LinkOption... options)UserPrincipalファイルの所有者を返します。UserPrincipalはユーザー識別情報を表す型で、ユーザー名を返すtoString()メソッドを持ちます。
LinkOptionでは、シンボリックリンクをたどるかどうかを指定します。
getLastModifiedTime(
Path path,
LinkOption... options)
FileTimeファイルの最終変更時刻を返します。
FileTimeはファイルのタイムスタンプの値を表す型です。
size(Path path)longファイルのサイズをバイト単位で返します。
isRegularFile(
Path path, LinkOption... options)
booleanファイルが通常のファイルであるかどうかを判定します。
ディレクトリファイルやデバイスファイルであった場合はfalseを返します。
isDirectory(
Path path, LinkOption... options)
booleanファイルがディレクトリファイルであるかどうかを判定します。
readAttributes(
Path path,
String attributes,
LinkOption... options)
Map<String,Object>
ファイルの属性のうち、attributesで指定した属性を一括で返します。
attributesに「"*"」を指定することですべての基本ファイル属性を返します。


Filesクラスを用いて属性を取得するサンプルコード

以下のサンプルコードは、カレントディレクトリに「sample.txt」という名前のファイルがあることを前提に記述しています。

public class getAttribute {
	public static void main(String[] args) {
		
		//FileSystemオブジェクトを取得
		FileSystem fileSystem = FileSystems.getDefault();
		
		//Pathオブジェクトを取得する
		Path path = fileSystem.getPath("./sample.txt");

		try {
			//Filesクラスが持つメソッドを実行
			System.out.println("ファイルの所有者: " + Files.getOwner(path));
			System.out.println("ファイルの最終更新時刻: " + Files.getLastModifiedTime(path));
			System.out.println("ファイルのサイズ: " + Files.size(path));
			System.out.println("通常ファイルかどうか: " + Files.isRegularFile(path));
			System.out.println("ディレクトリファイルかどうか: " + Files.isDirectory(path));
			System.out.println("基本ファイル属性: " + Files.readAttributes(path, "*"));
			System.out.println("サイズ・最終更新時刻・最終アクセス時刻: " + Files.readAttributes(path, "size,lastModifiedTime,lastAccessTime"));

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


FileStoreクラスのサンプルコードの実行結果

実行環境によって結果は異なりますが、上記のサンプルコードを実行すると著者の環境では以下のように出力されます。

ファイルの所有者: [PC名]\[ユーザー名]
ファイルの最終更新時刻: 2021-03-15T14:12:36.854Z
ファイルのサイズ: 13
通常ファイルかどうか: true
ディレクトリファイルかどうか: false
基本ファイル属性: {lastAccessTime=2021-04-25T16:18:15.06687Z, lastModifiedTime=2021-03-15T14:12:36.854Z, size=13, creationTime=2020-11-25T06:49:22.684401Z, isSymbolicLink=false, isRegularFile=true, fileKey=null, isOther=false, isDirectory=false}
サイズ・最終更新時刻・最終アクセス時刻: {lastAccessTime=2021-04-25T16:18:15.06687Z, lastModifiedTime=2021-03-15T14:12:36.854Z, size=13}


ファイル属性の変更

ファイル属性を変更するには、Filesクラスのメソッドを使用します。

ファイルの属性を変更するFilesクラスのメソッドには、以下のようなものがあります。

メソッド名返り値の型説明
setLastModifiedTime(Path path, FileTime time)Pathファイルの最終更新時刻を変更します。
setAttribute(Path,Path, String attribute,
Object value, LinkOption... options)
Pathファイル属性の値を設定します。
attributeには、「[ファイルシステム名(basic、dos、posixなど)]:[属性名]」という形式で属性を指定し、valueには属性の値を指定します。


ファイル属性を変更するサンプルコード

以下のサンプルコードは、カレントディレクトリに「sample.txt」という名前のファイルがあることを前提に記述しています。

public class setAttribute {
	public static void main(String[] args) {

		//FileSystemオブジェクトを取得
		FileSystem fileSystem = FileSystems.getDefault();

		//Pathオブジェクトを取得する
		Path path = fileSystem.getPath("./sample.txt");

		try {
			System.out.println("最終更新時刻: " + Files.getLastModifiedTime(path));
			System.out.println("書き込み可能かどうか: " + Files.isWritable(path));

			//ファイルの最終更新時刻を現在時刻に変更
			//FileTime.fromMillis(System.currentTimeMillis())で現在時刻をミリ秒単位で取得する
			Files.setLastModifiedTime(path, FileTime.fromMillis(System.currentTimeMillis()));
			
			//ファイルの属性を読み取り専用ファイルに変更
			//著者のPCではdos系のファイルシステムを使用しているので、「"dos:readonly"」のように変更したい属性を指定する
			Files.setAttribute(path, "dos:readonly", true);

			System.out.println("最終更新時刻: " + Files.getLastModifiedTime(path));
			System.out.println("書き込み可能かどうか: " + Files.isWritable(path));

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


ファイル属性を変更するサンプルコードの実行結果

以下のように、最終更新時刻と書き込み権限が変更されます。

最終更新時刻: 2021-04-29T10:51:40.406Z
書き込み可能かどうか: true
最終更新時刻: 2021-04-29T10:51:49.432Z
書き込み可能かどうか: false


まとめ

今回はファイル属性を取得・変更する方法について解説しました。使う頻度は少ないかもしれませんが、ファイル属性などのメタデータ管理はデータマネジメントを行う上で欠かせないものであるので、必要なときに使えるようにしておくとよいでしょう。


関連記事:

【Java】java.nio.fileパッケージ(NIO.2)

【Java】Pathオブジェクトを生成する方法(java.nio.fileパッケージ)

【Java】java.nio.fileパッケージの使用例①(ファイルの作成、存在チェック)

【Java】java.nio.fileパッケージの使用例②(移動・コピー、削除)

【Java】FileChannelを使って高速にファイル入出力を行ってみた

【Java】java.io.Fileクラスの使い方(ファイル・ディレクトリ操作、パス、ファイル名、拡張子)

【Java】java.io.Fileクラスの使い方(ファイル一覧の取得、フィルタ)


【著者】

ゆうさい

フォワードソフト株式会社のエンジニア。経験はまだ浅いものの、Java、Python、JavaScriptなど様々な言語の他、クラウドやネットワーク技術を勉強しています。PythonやVBAを使った自動化で楽をするのを考えるのが好きです。 Oracle Certified Java Programmer Gold SE 11、HTML5プロフェッショナル認定試験レベル2、AWSプラクティショナーなどの情報資格を保有しています。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様