1. Gambaran keseluruhan
Dalam tutorial ini, kita akan fokus pada pilihan terbuka standard yang tersedia untuk fail di Java.
Kami akan meneroka enum StandardOpenOption yang menerapkan antara muka OpenOption dan yang menentukan pilihan terbuka standard ini.
2. Parameter OpenOption
Di Java, kita dapat bekerja dengan file menggunakan NIO2 API, yang berisi beberapa metode utiliti. Sebilangan kaedah ini menggunakan parameter OpenOption pilihan yang mengkonfigurasi cara membuka atau membuat fail. Sebagai tambahan, parameter ini akan memiliki nilai default jika tidak ditetapkan, yang boleh berbeza untuk setiap kaedah ini.
The StandardOpenOption jenis enum mentakrifkan pilihan standard dan alat-alat yang OpenOption antara muka.
Inilah senarai pilihan yang disokong yang boleh kita gunakan dengan enum StandardOpenOptions :
- MENULIS : membuka fail untuk akses menulis
- LAMPIRAN : menambahkan beberapa data ke fail
- TRUNCATE_EXISTING : memotong fail
- CREATE_NEW : membuat fail baru dan membuang pengecualian jika fail tersebut sudah ada
- BUAT : membuka fail jika ada atau membuat fail baru jika tidak
- DELETE_ON_CLOSE : memadam fail setelah menutup aliran
- SPARSE : fail yang baru dibuat akan jarang
- SYNC : mengekalkan kandungan dan metadata fail yang diselaraskan
- DSYNC : menyimpan hanya kandungan fail yang disegerakkan
Di bahagian seterusnya, kita akan melihat contoh bagaimana menggunakan setiap pilihan ini.
Untuk mengelakkan kekeliruan pada jalan fail, mari kita menangani direktori utama pengguna, yang akan berlaku di semua sistem operasi:
private static String HOME = System.getProperty("user.home");
3. Membuka Fail untuk Membaca dan Menulis
Pertama, jika kita ingin membuat fail baru jika tidak ada, kita boleh menggunakan pilihan BUAT :
@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)); }
Kami juga dapat menggunakan pilihan CREATE_NEW, yang akan membuat file baru jika tidak ada. Walau bagaimanapun, ia akan membuat pengecualian sekiranya fail tersebut sudah ada.
Kedua, jika kita ingin membuka fail untuk membaca kita boleh menggunakan kaedah baruInputStream (Path, OpenOption. ..). Kaedah ini membuka fail 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 kita tidak menggunakan pilihan BACA kerana digunakan secara lalai dengan kaedah newInputStream .
Ketiga, kita dapat membuat file, menambahkan ke file, atau menulis ke file dengan menggunakan metode NewOutputStream (Path, OpenOption. ..). Kaedah ini membuka atau membuat fail untuk menulis dan mengembalikan OutputStream .
API akan membuat fail baru jika kita tidak menentukan pilihan terbuka, dan fail tersebut tidak ada. Namun, jika fail itu ada, file tersebut akan dipotong. Pilihan ini serupa dengan memanggil kaedah dengan pilihan CREATE dan TRUNCATE_EXISTING .
Mari buka fail yang 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 Fail SPARSE
Kita dapat memberitahu sistem fail bahawa fail yang baru dibuat harus jarang (fail yang mengandungi ruang kosong yang tidak akan ditulis ke disk).
Untuk ini, kita harus menggunakan pilihan SPARSE dengan pilihan CREATE_NEW . Walau bagaimanapun, pilihan ini akan diabaikan jika sistem fail tidak menyokong fail jarang .
Mari buat fail yang jarang:
@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. Menyelaraskan Fail
The StandardOpenOptions enum mempunyai SYNC dan DSYNC pilihan. Pilihan ini memerlukan data ditulis ke fail secara serentak di tempat penyimpanan. Dengan kata lain, ini akan menjamin bahawa data tidak hilang sekiranya berlaku kerosakan sistem .
Mari tambahkan beberapa data ke fail kami dan gunakan pilihan 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); }
Perbezaan antara SYNC dan DSYNC adalah bahawa SYNC menyimpan kandungan dan metadata fail secara serentak di tempat penyimpanan, sementara DSYNC hanya menyimpan kandungan fail secara serentak di tempat penyimpanan.
6. Memadam Fail Setelah Menutup Aliran
The StandardOpenOptions enum juga menawarkan pilihan berguna yang memberikan kita keupayaan untuk memusnahkan fail selepas menutup aliran. Ini berguna jika kita mahu membuat fail sementara.
Mari tambahkan beberapa data ke fail kami, dan gunakan pilihan 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. Kesimpulannya
Dalam tutorial ini, kami membahas pilihan yang tersedia untuk membuka file di Java menggunakan API sistem file baru (NIO2) yang dikirim sebagai bagian dari Java 7.
Seperti biasa, kod sumber dengan semua contoh dalam tutorial boleh didapati di Github.