Java 파일 열기 옵션

1. 개요

이 튜토리얼에서는 Java 파일에 사용할 수있는 표준 열기 옵션에 초점을 맞출 것입니다.

OpenOption 인터페이스 를 구현하고 이러한 표준 열기 옵션을 정의 하는 StandardOpenOption 열거 형을 살펴 보겠습니다 .

2. OpenOption 매개 변수

Java에서는 여러 유틸리티 메서드가 포함 된 NIO2 API를 사용하여 파일 작업을 할 수 있습니다. 이러한 방법 중 일부 는 파일을 열거 나 만드는 방법을 구성하는 선택적 OpenOption 매개 변수를 사용합니다. 또한이 매개 변수는 설정되지 않은 경우 기본값을 가지며 이러한 각 메소드에 대해 다를 수 있습니다.

StandardOpenOption의 열거 형은 표준 옵션과 구현 정의 OpenOption의 인터페이스를.

다음은 StandardOpenOptions 열거 형 과 함께 사용할 수있는 지원되는 옵션 목록입니다 .

  • WRITE : 쓰기 액세스를 위해 파일을 엽니 다.
  • APPEND : 일부 데이터를 파일에 추가합니다.
  • TRUNCATE_EXISTING : 파일을 자릅니다.
  • CREATE_NEW : 새 파일을 만들고 파일이 이미있는 경우 예외를 발생시킵니다.
  • CREATE : 파일이있는 경우 열거 나없는 경우 새 파일을 만듭니다.
  • DELETE_ON_CLOSE : 스트림 종료 후 파일 삭제
  • SPARSE : 새로 생성 된 파일이 희소합니다.
  • SYNC : 동기화 된 파일의 내용과 메타 데이터를 보존합니다.
  • DSYNC : 동기화 된 파일의 내용 만 보존

다음 섹션에서는 이러한 각 옵션을 사용하는 방법에 대한 예를 살펴 보겠습니다.

파일 경로에 대한 혼동을 피하기 위해 모든 운영 체제에서 유효한 사용자의 홈 디렉토리에 대한 핸들을 가져옵니다.

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

3. 읽고 쓰기위한 파일 열기

첫째, 존재하지 않는 새 파일을 생성하려면 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)); }

CREATE_NEW 옵션을 사용할 수도 있습니다.이 옵션 은 존재하지 않는 경우 새 파일을 생성합니다. 그러나 파일이 이미 존재하는 경우 예외가 발생합니다.

둘째, 읽기 위해 파일을 열려면 newInputStream (Path, 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 (Path, OpenOption. ..) 메서드 를 사용하여 파일을 생성하거나 파일에 추가하거나 파일에 쓸 수 있습니다. 이 메서드는 쓰기위한 파일을 열거 나 만들고 OutputStream을 반환 합니다 .

열기 옵션을 지정하지 않고 파일이 존재하지 않는 경우 API는 새 파일을 생성합니다. 그러나 파일이 존재하면 잘립니다. 이 옵션은 CREATETRUNCATE_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 파일 생성

새로 생성 된 파일이 희소해야한다고 파일 시스템에 알릴 수 있습니다 (디스크에 기록되지 않는 빈 공간을 포함하는 파일).

이를 위해 CREATE_NEW 옵션 과 함께 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. 파일 동기화 유지

StandardOpenOptions의 열거가있다 SYNC으로 dsync 옵션을. 이러한 옵션을 사용하려면 데이터가 스토리지의 파일에 동 기적으로 기록되어야합니다. 즉, 시스템 충돌시 데이터가 손실되지 않도록 보장합니다 .

파일에 데이터를 추가하고 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); }

차이 SYNC으로 dsync는 점이다 SYNC가 콘텐츠 및 동기 파일의 메타 데이터를 저장하고 , 저장하여 동안 으로 dsync에 동기하여 파일의 저장 내용 만 저장에이.

6. 스트림을 닫은 후 파일 삭제

StandardOpenOptions의 열거는 우리에게 스트림을 닫은 후 파일을 파괴 할 수있는 기능을 제공하는 유용한 옵션을 제공합니다. 임시 파일을 만들 때 유용합니다.

파일에 데이터를 추가하고 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 7의 일부로 제공되는 새로운 파일 시스템 API (NIO2)를 사용하여 Java에서 파일을 여는 데 사용할 수있는 옵션에 대해 설명했습니다.

평소와 같이 튜토리얼의 모든 예제가 포함 된 소스 코드는 Github에서 찾을 수 있습니다.