1. 概要

このチュートリアルでは、 java .ioAPIの一部であるファイルクラスの概要を説明します。  Fileクラスは、ファイルシステム上のファイルとディレクトリを操作する機能を提供します。

2. ファイルオブジェクトの作成

ファイルクラスには4つのパブリックコンストラクターがあります。 開発者のニーズに応じて、ファイルクラスのさまざまなタイプのインスタンスを作成できます。

  • File(String pathname) –指定されたpathnameを表すインスタンスを作成します
  • File(String parent、String child)parentパスとchildパスを結合することによって形成されるパスを表すインスタンスを作成します
  • File(File parent、String child) –別のFileインスタンスとchildによって表されるparentパスを結合することによって形成されるパスでインスタンスを作成しますパス
  • File(URI uri) –指定されたURIを表すインスタンスを作成します

3. ファイルクラスの操作

File クラスには、ファイルシステム上のファイルを操作および操作するためのメソッドがいくつかあります。 ここではそれらのいくつかを強調します。 Fileクラスはそれが表すファイルの内容を変更またはアクセスできないことに注意することが重要です。

3.1. ディレクトリとファイルの作成と削除

File クラスには、ディレクトリとファイルを作成および削除するためのインスタンスメソッドがあります。 ディレクトリとファイルは、それぞれmkdirメソッドとcreateNewFileメソッドを使用して作成されます。

ディレクトリとファイルは、deleteメソッドを使用して削除されます。 これらのメソッドはすべて、操作が成功した場合は true であり、それ以外の場合はfalseであるboolean値を返します。

@Test
public void givenDir_whenMkdir_thenDirIsDeleted() {
    File directory = new File("dir");
    assertTrue(directory.mkdir());
    assertTrue(directory.delete());
}

@Test
public void givenFile_whenCreateNewFile_thenFileIsDeleted() {
    File file = new File("file.txt");
    try {
        assertTrue(file.createNewFile());
    } catch (IOException e) {
        fail("Could not create " + "file.txt");
    }
    assertTrue(file.delete());
}

上記のスニペットには、その他の便利なメソッドも含まれています。

isDirectoryメソッドを使用して、指定された名前で示されるファイルがディレクトリであるかどうかをテストできます。 isFileメソッドを使用して、指定された名前で示されるファイルがディレクトリであるかどうかをテストできます。ファイル。 また、 presentsメソッドを使用して、ディレクトリまたはファイルがシステムにすでに存在するかどうかをテストできます。

3.2. ファイルインスタンスに関するメタデータの取得

ファイルクラスには、ファイルインスタンスに関するメタデータを返すメソッドがいくつかあります。 getName、getParentFile、およびgetPathメソッドの使用方法を見てみましょう。

@Test
public void givenFile_whenCreateNewFile_thenMetadataIsCorrect() {

    String sep = File.separator;

    File parentDir = makeDir("filesDir");

    File child = new File(parentDir, "file.txt");
    try {
        child.createNewFile();
    } catch (IOException e) {
        fail("Could not create " + "file.txt");
    }

    assertEquals("file.txt", child.getName());
    assertEquals(parentDir.getName(), child.getParentFile().getName());
    assertEquals(parentDir.getPath() + sep + "file.txt", child.getPath());

    removeDir(parentDir);
}

ここでは、ディレクトリ内に作成されたファイルに関するメタデータの検証について説明しました。 また、ファイルの親とそのファイルへの相対パスを見つける方法も示しました。

3.3. ファイルとディレクトリのアクセス許可の設定

ファイルクラスには、ファイルまたはディレクトリにアクセス許可を設定できるメソッドがあります。 ここでは、setWritableメソッドとsetReadableメソッドを見ていきます。

@Test
public void givenReadOnlyFile_whenCreateNewFile_thenCantModFile() {
    File parentDir = makeDir("readDir");

    File child = new File(parentDir, "file.txt");
    try {
        child.createNewFile();
    } catch (IOException e) {
        fail("Could not create " + "file.txt");
    }
    child.setWritable(false);
    boolean writable = true;
    try (FileOutputStream fos = new FileOutputStream(child)) {
        fos.write("Hello World".getBytes()); // write operation
        fos.flush();
    } catch (IOException e) {
        writable = false;
    } finally {
        removeDir(parentDir);
    }
    assertFalse(writable);
}

上記のコードでは、書き込みをブロックする権限をファイルに明示的に設定した後、ファイルへの書き込みを試みます。 これは、setWritableメソッドを使用して行います。 ファイルへの書き込みが許可されていないときにファイルに書き込もうとすると、IOExceptionがスローされます。

次に、読み取りをブロックする権限をファイルに設定した後、ファイルからの読み取りを試みます。 読み取りはsetReadableメソッドを使用してブロックされます:

@Test
public void givenWriteOnlyFile_whenCreateNewFile_thenCantReadFile() {
    File parentDir = makeDir("writeDir");

    File child = new File(parentDir, "file.txt");
    try {
        child.createNewFile();
    } catch (IOException e) {
        fail("Could not create " + "file.txt");
    }
    child.setReadable(false);
    boolean readable = true;
    try (FileInputStream fis = new FileInputStream(child)) {
        fis.read(); // read operation
    } catch (IOException e) {
        readable = false;
    } finally {
        removeDir(parentDir);
    }
    assertFalse(readable);
}

この場合も、 JVMは、読み取りが許可されていないファイルを読み取ろうとするとIOExceptionをスローします

3.4. ディレクトリ内のファイルの一覧表示

ファイルクラスには、ディレクトリに含まれるファイルを一覧表示できるメソッドがあります。 同様に、ディレクトリも一覧表示できます。 ここでは、 listメソッドとlist(FilenameFilter)メソッドを見ていきます。

@Test
public void givenFilesInDir_whenCreateNewFile_thenCanListFiles() {
    File parentDir = makeDir("filtersDir");

    String[] files = {"file1.csv", "file2.txt"};
    for (String file : files) {
        try {
            new File(parentDir, file).createNewFile();
        } catch (IOException e) {
            fail("Could not create " + file);
        }
    }

    //normal listing
    assertEquals(2, parentDir.list().length);

    //filtered listing
    FilenameFilter csvFilter = (dir, ext) -> ext.endsWith(".csv");
    assertEquals(1, parentDir.list(csvFilter).length);

    removeDir(parentDir);
}

ディレクトリを作成し、それに2つのファイルを追加しました。1つは csv 拡張子、もう1つはtxt拡張子です。 ディレクトリ内のすべてのファイルを一覧表示すると、期待どおりに2つのファイルが取得されます。 csv 拡張子のファイルをフィルタリングしてリストをフィルタリングすると、返されるファイルは1つだけになります。

3.5. ファイルとディレクトリの名前を変更する

File クラスには、renameToメソッドを使用してファイルとディレクトリの名前を変更する機能があります。

@Test
public void givenDir_whenMkdir_thenCanRenameDir() {

    File source = makeDir("source");
    File destination = makeDir("destination");
    boolean renamed = source.renameTo(destination);

    if (renamed) {
        assertFalse(source.isDirectory());
        assertTrue(destination.isDirectory());

        removeDir(destination);
    }
}

上記の例では、ソースディレクトリと宛先ディレクトリの2つのディレクトリを作成します。 次に、renameToメソッドを使用して、ソースディレクトリの名前を宛先ディレクトリに変更します。 同じことを使用して、ディレクトリの代わりにファイルの名前を変更できます。

3.6. ディスク容量情報の取得

ファイルクラスでは、ディスクスペース情報を取得することもできます。 getFreeSpaceメソッドデモンストレーションを見てみましょう。

@Test
public void givenDataWritten_whenWrite_thenFreeSpaceReduces() {

    String home = System.getProperty("user.home");
    String sep = File.separator;
    File testDir = makeDir(home + sep + "test");
    File sample = new File(testDir, "sample.txt");

    long freeSpaceBefore = testDir.getFreeSpace();
    try {
        writeSampleDataToFile(sample);
    } catch (IOException e) {
        fail("Could not write to " + "sample.txt");
    }

    long freeSpaceAfter = testDir.getFreeSpace();
    assertTrue(freeSpaceAfter < freeSpaceBefore);

    removeDir(testDir);
}

この例では、ユーザーのホームディレクトリ内にディレクトリを作成し、その中にファイルを作成しました。 次に、このファイルにテキストを入力した後、ホームディレクトリパーティションの空き領域が変更されたかどうかを確認しました。 ディスクスペースに関する情報を提供する他のメソッドは、getTotalSpaceおよび getUsableSpaceです。

4. 結論

このチュートリアルでは、Fileクラスがファイルシステム上のファイルとディレクトリを操作するために提供する機能のいくつかを示しました。 .

いつものように、この例の完全なソースコードは、Githubから入手できます。