Kelas File Java

1. Ikhtisar

Dalam tutorial ini, kami akan memberikan gambaran umum tentang kelas File , yang merupakan bagian dari java.io API. Kelas File memberi kita kemampuan untuk bekerja dengan file dan direktori pada sistem file .

2. Membuat Objek File

Kelas File memiliki 4 konstruktor publik. Bergantung pada kebutuhan pengembang, berbagai jenis instance kelas File dapat dibuat.

  • File (String pathname) - Menciptakan sebuah contoh yang mewakili diberikan pathname
  • File (String orang tua, anak String) - Menciptakan sebuah contoh yang mewakili jalan dibentuk dengan bergabung dalam induk dan anak jalan
  • File (File parent, String child) - Membuat instance dengan jalur yang dibentuk dengan bergabung dengan jalur induk yang diwakili oleh instance File lain dan jalur anak
  • File (URI uri) - Membuat instance yang mewakili Uniform Resource Identifier yang diberikan

3. Bekerja dengan Kelas File

Kelas File memiliki sejumlah metode yang memungkinkan kita untuk bekerja dengan dan memanipulasi file pada sistem file. Kami akan menyoroti beberapa di antaranya di sini. Penting untuk diperhatikan bahwa kelas File tidak dapat mengubah atau mengakses konten file yang diwakilinya.

3.1. Membuat dan Menghapus Direktori dan File

Kelas File memiliki metode instan untuk membuat dan menghapus direktori dan file. Direktori dan file yang dibuat menggunakan mkdir dan createNewFile metode , masing-masing.

Direktori dan file dihapus menggunakan metode delete . Semua metode ini mengembalikan nilai boolean yang benar saat operasi berhasil, dan salah jika sebaliknya:

@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()); }

Dalam cuplikan di atas, kami juga melihat metode bermanfaat lainnya .

The isDirectory metode dapat digunakan untuk menguji apakah file dilambangkan dengan nama yang diberikan adalah sebuah direktori, sementara yang isFile metode dapat digunakan untuk menguji apakah file dilambangkan dengan nama yang diberikan adalah file. Dan, kita bisa menggunakan yang ada metode untuk menguji apakah direktori atau file sudah ada pada sistem.

3.2. Mendapatkan Metadata Tentang Contoh File

Kelas File memiliki sejumlah metode yang mengembalikan metadata tentang instance File . Mari kita lihat bagaimana menggunakan getName, getParentFile, dan getPath metode :

@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); }

Di sini, kami telah mengilustrasikan memvalidasi metadata tentang file yang dibuat di dalam direktori. Kami juga telah menunjukkan cara menemukan induk file dan jalur relatif ke file itu.

3.3. Mengatur Izin File dan Direktori

Kelas File memiliki metode yang memungkinkan Anda menyetel izin pada file atau direktori. Di sini, kita akan melihat setWritable dan setReadablemetode :

@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); }

Pada kode di atas, kami mencoba untuk menulis ke file setelah kami secara eksplisit menetapkan izin padanya yang memblokir penulisan apa pun. Kami melakukan ini dengan metode setWritable . Mencoba menulis ke file saat menulis ke file tidak diizinkan mengakibatkan IOException dilempar.

Selanjutnya, kami mencoba membaca dari file setelah menyetel izin padanya yang memblokir setiap pembacaan. Pembacaan diblokir menggunakan metode 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); }

Sekali lagi, JVM akan menampilkan IOException untuk upaya membaca file di mana pembacaan tidak diizinkan .

3.4. Daftar File Di Dalam Direktori

Kelas File memiliki metode yang memungkinkan kita untuk membuat daftar file yang terdapat dalam direktori. Demikian pula, direktori juga dapat dicantumkan. Di sini kita akan melihat daftar dan daftar metode (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); }

Kami membuat direktori dan menambahkan dua file ke dalamnya - satu dengan ekstensi csv dan yang lainnya dengan ekstensi txt . Saat mencantumkan semua file di direktori, kami mendapatkan dua file seperti yang diharapkan. Ketika kami memfilter daftar dengan memfilter di sekitar file dengan ekstensi csv , kami hanya mendapatkan satu file yang dikembalikan.

3.5. Mengganti Nama File dan Direktori

Kelas File memiliki fungsionalitas untuk mengganti nama file dan direktori menggunakan metode 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); } }

In the example above, we create two directories — the source and the destination directories. We then rename the source directory to the destination directory using the renameTo method. The same can be used to rename files instead of directories.

3.6. Getting Disk Space Information

The File class also allows us to get disk space information. Let's see a demonstration of the getFreeSpace method:

@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); }

Dalam contoh ini, kami membuat direktori di dalam direktori home pengguna dan kemudian membuat file di dalamnya. Kami kemudian memeriksa apakah ruang kosong di partisi direktori home telah berubah setelah mengisi file ini dengan beberapa teks. Metode lain yang memberikan informasi tentang ruang disk adalah getTotalSpace dan getUsableSpace .

4. Kesimpulan

Dalam tutorial ini, kami telah menunjukkan beberapa fungsionalitas yang disediakan kelas File untuk bekerja dengan file dan direktori pada sistem file. .

Seperti biasa, kode sumber lengkap dari contoh ini tersedia di Github.