File Java Buka Opsi

1. Ikhtisar

Dalam tutorial ini, kami akan fokus pada opsi terbuka standar yang tersedia untuk file di Java.

Kami akan menjelajahi enum StandardOpenOption yang mengimplementasikan antarmuka OpenOption dan yang mendefinisikan opsi terbuka standar ini.

2. Parameter OpenOption

Di Java, kita dapat bekerja dengan file menggunakan NIO2 API, yang berisi beberapa metode utilitas. Beberapa metode ini menggunakan parameter OpenOption opsional yang mengonfigurasi cara membuka atau membuat file. Selain itu, parameter ini akan memiliki nilai default jika tidak disetel, yang dapat berbeda untuk masing-masing metode ini.

The StandardOpenOption tipe enum mendefinisikan pilihan standar dan alat yang OpenOption antarmuka.

Berikut daftar opsi yang didukung yang dapat kita gunakan dengan enum StandardOpenOptions :

  • MENULIS : membuka file untuk akses tulis
  • LAMPIRAN : menambahkan beberapa data ke file
  • TRUNCATE_EXISTING : memotong file
  • CREATE_NEW : membuat file baru dan membuat pengecualian jika file tersebut sudah ada
  • BUAT : membuka file jika ada atau membuat file baru jika tidak ada
  • DELETE_ON_CLOSE : menghapus file setelah menutup aliran
  • SPARSE : file yang baru dibuat akan menjadi sparse
  • SYNC : mempertahankan konten dan metadata dari file yang disinkronkan
  • DSYNC : mempertahankan hanya konten file yang disinkronkan

Di bagian selanjutnya, kita akan melihat contoh cara menggunakan setiap opsi ini.

Untuk menghindari kebingungan pada jalur file, mari kita lihat direktori home pengguna, yang akan berlaku di semua sistem operasi:

private static String HOME = System.getProperty("user.home");

3. Membuka File untuk Membaca dan Menulis

Pertama, jika kita ingin membuat file baru jika belum ada kita dapat menggunakan opsi CREATE :

@Test public void givenExistingPath_whenCreateNewFile_thenCorrect() throws IOException { assertFalse(Files.exists(Paths.get(HOME, "newfile.txt"))); Files.write(path, DUMMY_TEXT.getBytes(), StandardOpenOption.CREATE); assertTrue(Files.exists(path)); }

Kita juga dapat menggunakan opsi CREATE_NEW, yang akan membuat file baru jika tidak ada. Namun, itu akan memunculkan pengecualian jika file tersebut sudah ada.

Kedua, jika kita ingin membuka file untuk dibaca, kita bisa menggunakan metode newInputStream (Path, OpenOption. ..). Metode ini membuka file untuk membaca dan mengembalikan aliran input:

@Test public void givenExistingPath_whenReadExistingFile_thenCorrect() throws IOException { Path path = Paths.get(HOME, DUMMY_FILE_NAME); try (InputStream in = Files.newInputStream(path); BufferedReader reader = new BufferedReader(new InputStreamReader(in))) { String line; while ((line = reader.readLine()) != null) { assertThat(line, CoreMatchers.containsString(DUMMY_TEXT)); } } } 

Perhatikan bagaimana kami tidak menggunakan opsi BACA karena ini digunakan secara default oleh metode newInputStream .

Ketiga, kita dapat membuat file, menambahkan file, atau menulis ke file dengan menggunakan metode newOutputStream (Path, OpenOption. ..). Metode ini membuka atau membuat file untuk menulis dan mengembalikan OutputStream .

API akan membuat file baru jika kita tidak menentukan opsi buka, dan file tersebut tidak ada. Namun, jika file tersebut ada, file tersebut akan dipotong. Opsi ini mirip dengan memanggil metode dengan opsi BUAT dan TRUNCATE_EXISTING .

Mari buka file yang sudah ada dan tambahkan beberapa data:

@Test public void givenExistingPath_whenWriteToExistingFile_thenCorrect() throws IOException { Path path = Paths.get(HOME, DUMMY_FILE_NAME); try (OutputStream out = Files.newOutputStream(path, StandardOpenOption.APPEND, StandardOpenOption.WRITE)) { out.write(ANOTHER_DUMMY_TEXT.getBytes()); } }

4. Membuat File SPARSE

Kita dapat memberi tahu sistem file bahwa file yang baru dibuat harus jarang (file berisi ruang kosong yang tidak akan ditulis ke disk).

Untuk ini, kita harus menggunakan opsi jarang dengan CREATE_NEW pilihan. Namun, opsi ini akan diabaikan jika sistem file tidak mendukung file renggang .

Mari buat file sparse:

@Test public void givenExistingPath_whenCreateSparseFile_thenCorrect() throws IOException { Path path = Paths.get(HOME, "sparse.txt"); Files.write(path, DUMMY_TEXT.getBytes(), StandardOpenOption.CREATE_NEW, StandardOpenOption.SPARSE); }

5. Menjaga File Tersinkronisasi

The StandardOpenOptions enum memiliki SYNC dan DSYNC pilihan. Opsi ini mengharuskan data ditulis ke file secara sinkron di penyimpanan. Dengan kata lain, ini akan menjamin bahwa data tidak hilang jika terjadi kerusakan sistem .

Mari tambahkan beberapa data ke file kita dan gunakan opsi SYNC :

@Test public void givenExistingPath_whenWriteAndSync_thenCorrect() throws IOException { Path path = Paths.get(HOME, DUMMY_FILE_NAME); Files.write(path, ANOTHER_DUMMY_TEXT.getBytes(), StandardOpenOption.APPEND, StandardOpenOption.WRITE, StandardOpenOption.SYNC); }

Perbedaan antara SYNC dan DSYNC adalah SYNC menyimpan konten dan metadata file secara sinkron di penyimpanan, sedangkan DSYNC hanya menyimpan konten file secara sinkron di penyimpanan.

6. Menghapus File Setelah Menutup Stream

The StandardOpenOptions enum juga menawarkan pilihan yang berguna yang memberikan kita kemampuan untuk menghancurkan file setelah menutup sungai. Ini berguna jika kita ingin membuat file sementara.

Mari tambahkan beberapa data ke file kita, dan gunakan opsi DELETE_ON_CLOSE :

@Test public void givenExistingPath_whenDeleteOnClose_thenCorrect() throws IOException { Path path = Paths.get(HOME, EXISTING_FILE_NAME); assertTrue(Files.exists(path)); // file was already created and exists try (OutputStream out = Files.newOutputStream(path, StandardOpenOption.APPEND, StandardOpenOption.WRITE, StandardOpenOption.DELETE_ON_CLOSE)) { out.write(ANOTHER_DUMMY_TEXT.getBytes()); } assertFalse(Files.exists(path)); // file is deleted }

7. Kesimpulan

Dalam tutorial ini, kami membahas opsi yang tersedia untuk membuka file di Java menggunakan API sistem file baru (NIO2) yang dikirimkan sebagai bagian dari Java 7.

Seperti biasa, kode sumber dengan semua contoh dalam tutorial dapat ditemukan di Github.