1. 개요
이 기사에서는 Java에서 파일을 복사하는 일반적인 방법에 대해 설명합니다.
먼저 표준 IO 및 NIO.2 API와 두 개의 외부 라이브러리 인 commons-io 및 guava를 사용 합니다.
2. IO API (JDK7 이전)
우선, java.io API 로 파일 을 복사 하려면 스트림을 열고 콘텐츠를 반복하여 다른 스트림에 기록해야합니다.
@Test
public void givenIoAPI_whenCopied_thenCopyExistsWithSameContents()
throws IOException {
File copied = new File("src/test/resources/copiedWithIo.txt");
try (
InputStream in = new BufferedInputStream(
new FileInputStream(original));
OutputStream out = new BufferedOutputStream(
new FileOutputStream(copied))) {
byte[] buffer = new byte[1024];
int lengthRead;
while ((lengthRead = in.read(buffer)) > 0) {
out.write(buffer, 0, lengthRead);
out.flush();
}
}
assertThat(copied).exists();
assertThat(Files.readAllLines(original.toPath())
.equals(Files.readAllLines(copied.toPath())));
}
이러한 기본 기능을 구현하기 위해 많은 작업이 필요합니다.
다행히도 Java는 핵심 API를 개선했으며 NIO.2 API를 사용하여 파일을 복사하는 더 간단한 방법을 가지고 있습니다 .
3. NIO.2 API (JDK7)
사용 NIO.2하는 것은 상당히 이후 성능을 복사 파일을 증가시킬 수 NIO.2이 낮은 수준의 시스템 진입 점을 사용합니다.
파일 방법을 자세히 살펴 보겠습니다. copy () 메서드가 작동합니다.
사본 () 메소드는 우리에게 복사 옵션을 나타내는 선택적 인수를 지정할 수있는 기능을 제공합니다. 기본적으로 파일 및 디렉터리 복사는 기존 항목을 덮어 쓰지 않으며 파일 속성을 복사하Map 않습니다.
이 동작은 다음 복사 옵션을 사용하여 변경할 수 있습니다.
- REPLACE_EXISTING – 파일이있는 경우 교체
- COPY_ATTRIBUTES – 메타 데이터를 새 파일로 복사
- NOFOLLOW_LINKS – 심볼릭 링크를 따라 가면 안됩니다.
NIO.2 파일 클래스는 오버로드의 세트 제공 사본 () 파일 시스템 내에서 파일과 디렉토리를 복사하는 방법.
두 개의 Path 인수 와 함께 copy () 를 사용하는 예제를 살펴 보겠습니다 .
@Test
public void givenNIO2_whenCopied_thenCopyExistsWithSameContents()
throws IOException {
Path copied = Paths.get("src/test/resources/copiedWithNio.txt");
Path originalPath = original.toPath();
Files.copy(originalPath, copied, StandardCopyOption.REPLACE_EXISTING);
assertThat(copied).exists();
assertThat(Files.readAllLines(originalPath)
.equals(Files.readAllLines(copied)));
}
그 주 디렉토리를 복사 얕은있는 디렉토리 내 파일과 하위 디렉토리를 복사하지 않는 것을 의미한다.
4. Apache Commons IO
Java로 파일을 복사하는 또 다른 일반적인 방법은 commons-io 라이브러리를 사용하는 것 입니다.
먼저 의존성을 추가해야합니다.
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
최신 버전은 Maven Central 에서 다운로드 할 수 있습니다 .
그런 다음 파일을 복사 하려면 FileUtils 클래스에 정의 된 copyFile () 메서드 를 사용해야합니다 . 이 메서드는 소스 및 대상 파일을 사용합니다.
copyFile () 메서드를 사용하여 JUnit 테스트를 살펴 보겠습니다 .
@Test
public void givenCommonsIoAPI_whenCopied_thenCopyExistsWithSameContents()
throws IOException {
File copied = new File(
"src/test/resources/copiedWithApacheCommons.txt");
FileUtils.copyFile(original, copied);
assertThat(copied).exists();
assertThat(Files.readAllLines(original.toPath())
.equals(Files.readAllLines(copied.toPath())));
}
5. 구아바
마지막으로 Google의 Guava 라이브러리를 살펴 보겠습니다.
우리는 구아바를 사용하려면 다시 한번 , 우리는 의존성을 포함해야합니다 :
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
최신 버전은 Maven Central 에서 찾을 수 있습니다 .
다음은 Guava의 파일 복사 방법입니다.
@Test
public void givenGuava_whenCopied_thenCopyExistsWithSameContents()
throws IOException {
File copied = new File("src/test/resources/copiedWithGuava.txt");
com.google.common.io.Files.copy(original, copied);
assertThat(copied).exists();
assertThat(Files.readAllLines(original.toPath())
.equals(Files.readAllLines(copied.toPath())));
}
6. 결론
이 기사에서는 Java에서 파일을 복사하는 가장 일반적인 방법을 살펴 보았습니다.