Kelas Fail Java

1. Gambaran keseluruhan

Dalam tutorial ini, kami akan memberikan gambaran keseluruhan kelas Fail , yang merupakan sebahagian daripada API java.io. The File kelas memberikan kita keupayaan untuk bekerja dengan fail dan direktori pada sistem fail .

2. Membuat Objek Fail

The File kelas mempunyai 4 pengeluar awam. Bergantung pada keperluan pemaju, pelbagai jenis kelas Fail dapat dibuat.

  • Fail (String pathname) - Membuat instance yang mewakili nama jalan yang diberikan
  • Fail (String ibubapa, String kanak-kanak) - Mencipta satu contoh yang mewakili jalan yang dibentuk dengan menyertai ibu bapa dan kanak-kanak laluan
  • Fail (Ibu bapa fail, anak String) - Membuat instance dengan jalan yang dibentuk dengan bergabung dengan jalan induk yang diwakili oleh instance Fail lain dan jalan anak
  • Fail (URI uri) - Membuat contoh yang mewakili Uniform Resource Identifier yang diberikan

3. Bekerja dengan Kelas Fail

The File kelas mempunyai beberapa kaedah yang membolehkan kita untuk bekerja dengan dan memanipulasi fail pada sistem fail. Kami akan mengetengahkan sebilangannya di sini. Penting untuk diperhatikan bahawa kelas Fail tidak dapat mengubah atau mengakses kandungan fail yang diwakilinya.

3.1. Membuat dan Menghapus Direktori dan Fail

The File kelas mempunyai kaedah contoh untuk mewujudkan dan direktori padam dan fail. Direktori dan fail yang dicipta menggunakan mkdir dan createNewFile kaedah masing-masing.

Direktori dan fail dihapuskan menggunakan kaedah hapus . Semua kaedah ini mengembalikan boolean nilai yang benar apabila operasi itu berjaya, dan palsu 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 coretan di atas, kami juga melihat kaedah lain yang bermanfaat .

The isDirectory kaedah boleh digunakan untuk ujian jika fail yang ditandakan dengan nama yang diberikan adalah direktori, manakala yang isFile kaedah boleh digunakan untuk ujian jika fail yang ditandakan dengan nama yang diberikan adalah fail. Dan, kita boleh menggunakan yang wujud kaedah untuk menguji sama ada direktori atau fail sudah wujud pada sistem.

3.2. Mendapatkan Metadata Mengenai Contoh Fail

The File kelas mempunyai beberapa kaedah yang metadata pulangan tentang fail kes. Mari kita lihat bagaimana untuk menggunakan getName, getParentFile, dan getPath kaedah :

@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 menggambarkan mengesahkan metadata mengenai fail yang dibuat di dalam direktori. Kami juga telah menunjukkan cara mencari induk fail dan jalan relatif ke fail tersebut.

3.3. Menetapkan Kebenaran Fail dan Direktori

The File kelas mempunyai kaedah yang membolehkan anda untuk menetapkan keizinan pada fail atau direktori. Di sini, kita akan melihat setWritable dan setReadablekaedah :

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

Dalam kod di atas, kami cuba menulis ke fail setelah kami secara jelas menetapkan kebenaran padanya yang menyekat sebarang penulisan. Kami melakukan ini dengan kaedah setWritable . Percubaan untuk menulis ke fail semasa menulis ke fail tidak dibenarkan mengakibatkan IOException dibuang.

Seterusnya, kami cuba membaca dari fail setelah menetapkan izin di dalamnya yang menyekat pembacaan. Pembacaan disekat menggunakan kaedah 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 melontarkan IOException kerana percubaan membaca fail di mana pembacaan tidak dibenarkan .

3.4. Menyenaraikan Fail Di dalam Direktori

The File kelas mempunyai kaedah yang membolehkan kita untuk fail senarai yang terkandung dalam direktori. Begitu juga, direktori juga boleh disenaraikan. Di sini kita akan melihat senarai dan senarai (FilenameFilter) kaedah :

@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 fail padanya - satu dengan sambungan csv dan yang lain dengan sambungan txt . Semasa menyenaraikan semua fail dalam direktori, kami mendapat dua fail seperti yang diharapkan. Apabila kami menyaring penyenaraian dengan menyaring sekitar fail dengan pelanjutan csv , kami hanya mendapat satu fail yang dikembalikan.

3.5. Menamakan semula Fail dan Direktori

The File kelas mempunyai fungsi penamaan semula fail dan direktori menggunakan renameTo kaedah :

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

Dalam contoh di atas, kami membuat dua direktori - direktori sumber dan destinasi. Kami kemudian menamakan semula direktori sumber ke direktori tujuan menggunakan kaedah renameTo . Perkara yang sama boleh digunakan untuk menamakan semula fail dan bukannya direktori.

3.6. Mendapatkan Maklumat Ruang Cakera

The File kelas juga membolehkan kami untuk mendapatkan maklumat ruang cakera. Mari lihat demonstrasi kaedah 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); }

Dalam contoh ini, kami membuat direktori di dalam direktori utama pengguna dan kemudian membuat fail di dalamnya. Kami kemudian memeriksa apakah ruang kosong pada partisi direktori rumah telah berubah setelah mengisi fail ini dengan beberapa teks. Kaedah lain yang memberikan maklumat mengenai ruang cakera adalah getTotalSpace dan getUsableSpace .

4. Kesimpulan

Dalam tutorial ini, kami telah menunjukkan beberapa fungsi yang disediakan oleh kelas Fail untuk bekerja dengan fail dan direktori pada sistem fail. .

Seperti biasa, kod sumber penuh contoh terdapat di Github.