Рубрики
Без рубрики

Варианты открытых файлов Java

Узнайте о нескольких вариантах при открытии файлов на Java.

Автор оригинала: baeldung.

1. Обзор

В этом учебнике мы сосредоточимся на стандартных открытых опциях, доступных для файлов на Java.

Мы исследуем СтандартОткрытие enum, который реализует OpenOption интерфейс и что определяет эти стандартные открытые варианты.

2. Параметр OpenOption

На Java мы можем работать с файлами с помощью API NIO2, который содержит несколько полезных методов. Некоторые из этих методов используют необязательный OpenOption параметр, который настраивает, как открыть или создать файл. Кроме того, этот параметр будет иметь значение по умолчанию, если не установить, который может быть различным для каждого из этих методов.

СтандартОткрытие тип enum определяет стандартные параметры и реализует OpenOption интерфейс.

Вот список поддерживаемых вариантов, которые мы можем использовать с СтандартОткрытия enum:

  • WRITE : открывает файл для доступа к записи
  • ПРИЛОЖЕНИЕ : придатки некоторых данных в файл
  • TRUNCATE_EXISTING : усечение файла
  • CREATE_NEW : создает новый файл и бросает исключение, если файл уже существует
  • СОЗДАТЬ : открывает файл, если он существует или создает новый файл, если он не
  • DELETE_ON_CLOSE : удаляет файл после закрытия потока
  • SPARSE : вновь созданный файл будет редким
  • СИНХРОНИЗАЦИя : сохраняет содержимое и метаданные синхронизированного файла
  • DSYNC : сохраняет только синхронизированное содержимое файла

В следующих разделах мы увидим примеры использования каждого из этих вариантов.

Чтобы избежать путаницы на пути файла, давайте разберемся с домашним каталогом пользователя, который будет действителен во всех операционных системах:

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

3. Открытие файла для чтения и письма

Во-первых, если мы хотим для создания нового файла, если он не существует, мы можем использовать опцию СОЗДАТЬ :

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

Мы также можем использовать опцию CREATE_NEW, который создаст новый файл, если он не существует. Тем не менее, он будет бросать исключение, если файл уже существует.

Во-вторых, если мы хотим чтобы открыть файл для чтения, мы можем использовать newInputStream (Путь, OpenOption. ..) метод. Этот метод открывает файл для чтения и возвращает входной поток:

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

Обратите внимание, как мы не использовали опцию READ потому что он используется по умолчанию методом newInputStream .

В-третьих, мы можем создать файл, придать файл или записать его в файл с помощью newOutputStream (Путь, OpenOption. ..) метод. Этот метод открывает или создает файл для записи и возвращает ВыходСтрим .

API создаст новый файл, если мы не указать открытые варианты, и файл не существует. Однако, если файл существует, он будет усечен. Эта опция аналогична вызову метода с помощью СОЗДАТЬ и TRUNCATE_EXISTING Параметры.

Давайте откроем существующий файл и прикроем некоторые данные:

@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. Создание файла SPARSE

Мы можем сказать файловой системе, что вновь созданный файл должен быть редким (файлы, содержащие пустые пространства, которые не будут записаны на диск).

Для этого мы должны использовать опцию SPARSE с CREATE_NEW выбор. Тем не менее, эта опция будет проигнорирована, если файловая система не поддерживает редкие файлы .

Давайте создадим редкий файл:

@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. Синхронизация файлов

СтандартОткрытия enum имеет СИНХРОНИЗАЦИя и DSYNC Параметры. Эти параметры требуют, чтобы данные были записаны в файл синхронно в хранилище. Другими словами, они гарантируют, что данные не будут потеряны в случае сбоя системы .

Давайте добавим некоторые данные в наш файл и будем использовать опцию СИНХРОНИЗАЦИя :

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

Разница между СИНХРОНИЗАЦИя и DSYNC является то, СИНХРОНИЗАЦИя хранит содержимое и метаданные файла синхронно в хранилище, в то время как DSYNC хранит только содержимое файла синхронно на складе.

6. Удаление файла после закрытия потока

СтандартОткрытия enum также предлагает полезную опцию, которая дает нам возможность уничтожить файл после закрытия потока. Это полезно, если мы хотим создать временный файл.

Давайте добавим некоторые данные в наш файл, и использовать опцию 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. Заключение

В этом учебнике мы рассмотрели доступные варианты для открытия файлов на Java с помощью новой файловой системы API (NIO2), которая была отправлена в рамках Java 7.

Как обычно, исходный код со всеми примерами в учебнике можно найти более на Github .