Java java.nio.file.Files size() メソッド

Java File Java java.nio.file.Files


java.nio.file.Files.size()Java NIO (New I/O) パッケージ内の非常に実用的な静的メソッドであり、指定されたファイルのサイズ(バイト単位)を取得するために使用されます。このメソッドはjava.nio.fileパッケージに属し、Java 7 で導入されたファイル操作 API の一部です。

メソッド定義

public static long size(Path path) throws IOException

メソッドパラメータ

Path path

  • 型: java.nio.file.Path
  • 説明: サイズを取得する対象のファイルパスオブジェクト
  • 注意:
    • 実際に存在するファイルを指している必要があります
    • ディレクトリにすることはできません(その場合、例外がスローされます)
    • パスは絶対パスでも相対パスでも構いません

戻り値

long 型

  • 意味: ファイルのサイズをバイト単位で返します
  • 特徴:
    • ファイルが空の場合は 0 を返します
    • 大きなファイルの場合、戻り値が ... を超える可能性がありますInteger.MAX_VALUE

例外処理

size()このメソッドは以下の例外をスローする可能性があります:

IOException

  • 発生条件:
    • ファイルが存在しない
    • ファイルを読み取る権限がない
    • 入出力エラーが発生
    • パスがファイルではなくディレクトリを指している

SecurityException

  • 発生条件: セキュリティマネージャーが存在し、ファイルへのアクセスを拒否した場合

使用例

基本的な使い方

サンプル

import java.nio.file.*;
import java.io.IOException;

public class FileSizeExample {
    public static void main(String[] args) {
        Path filePath = Paths.get("example.txt");
       
        try {
            long fileSize = Files.size(filePath);
            System.out.println("File size: " + fileSize + " bytes");
        } catch (IOException e) {
            System.err.println("Error getting file size: " + e.getMessage());
        }
    }
}

大ファイルの処理

サンプル

// 非常に大きい可能性のあるファイルの場合、より分かりやすい表示方法を検討してください
public static String formatFileSize(long size) {
    if (size < 1024) return size + " B";
    int exp = (int) (Math.log(size) / Math.log(1024));
    char unit = "KMGTPE".charAt(exp-1);
    return String.format("%.1f %sB", size / Math.pow(1024, exp), unit);
}

注意事項

  1. パフォーマンスに関する考慮事項:

    • ローカルファイルシステムの場合、size()操作は通常非常に高速です
    • ネットワークファイルシステムの場合は、遅延が発生する可能性があります
  2. シンボリックリンク:

    • パスがシンボリックリンクの場合、リンク先の実際のファイルサイズを返します
  3. ファイルロック:

    • メソッド実行中はファイルがロックされないため、取得直後にファイルサイズが変更される可能性があります
  4. 代替手段:

    • 古いバージョンの Java では、... を使用できますjava.io.File.length()

実際の適用シナリオ

ファイルアップロード前のチェック:

サンプル

// ファイルが許可されたサイズを超えていないか確認します
if (Files.size(filePath) > MAX_UPLOAD_SIZE) {
    throw new FileTooLargeException();
}

ディスク容量管理:

サンプル

// ディレクトリ内のすべてのファイルの合計サイズを計算します
long totalSize = Files.walk(dirPath)
                    .filter(Files::isRegularFile)
                    .mapToLong(Files::size)
                    .sum();

進捗表示:

サンプル

// ファイルコピーの進捗状況を表示します
long totalBytes = Files.size(sourcePath);
long copiedBytes = 0;
// ...コピーループ内で進捗率を更新して表示...

よくある質問(FAQ)

Q1: size() メソッドはディレクトリに使用できますか?

いいえ、パスがディレクトリを指す場合は、... がスローされますIOException。ディレクトリのサイズを取得するには、... を使用する必要がありますFiles.walk()ディレクトリの内容を走査し、ファイルサイズを累計します。

Q2: このメソッドはブロックしますか?

ローカルファイルシステムでは通常ブロックしませんが、ネットワークファイルシステムでは遅延が発生する可能性があります。

Q3: 戻り値が int ではなく long なのはなぜですか?

一部のファイルは 2GB(Integer.MAX_VALUE)を超える可能性があるため、long を使用すると超大ファイルをサポートできます。

Q4: このメソッドと File.length() の違いは何ですか?

Files.size()NIO.2 API の一部であり、シンボリックリンクなど、より多くの最新ファイルシステム機能をサポートしています。一方、File.length()は従来の I/O のメソッドです。


まとめ

java.nio.file.Files.size()このメソッドは、ファイルサイズを取得するためのシンプルかつ効果的な方法を提供し、ファイル操作でよく使用されるユーティリティメソッドです。その使用法と潜在的な例外を理解することは、堅牢なファイル処理コードを作成するために非常に重要です。

Java File Java java.nio.file.Files

その他の拡張