본문으로 바로가기

[JAVA] 파일 복사

category 프로그래밍/JAVA 2020. 10. 5. 23:20
728x90
반응형

최근에 요구사항이 발생하여 자바로 코딩을 하는 중 성능테스트를 하였습니다.

결과는 FAIL이 나버렸고,,,

대량의 데이터를 전송하다보니 성능에 문제가 있더라구요.

분석 결과, 파일 복사에서 많은 시간이 걸렸습니다.

그로 인하여 자바 복사 방법에 대해서 조사를 하였습니다.

자바를 이용한 복사 방법 중 가장 많이 쓰이는 3가지에 대해 알아보겠습니다.

1. stream

구글링을 했을 때 가장 많이 나오는 방법입니다.

저도 이 방법을 사용하여 파일 복사를 하였습니다.

파일을 input stream으로 불러 들이고, out stream으로 전송하여 파일을 복사합니다.

간단한 예제를 하나 만들어보겠습니다.

===============================================================

String org_file = "org.txt";

String copy_file = "copy.txt";

 

FileInputStream fis = new FileInputStream(org_file);
FileOutputStream fos = new FileOutputStream(copy_file);

int byte = 0;

while ( ( byte = fis.read() ) != -1 )

{

    fos.write(byte);

}

fis.close();

fos.close();

===============================================================

 

위의 코드는 while문을 이용하여 1바이트씩 input stream을 거쳐 outstream 으로 파일을 쓰는 것입니다.

파일이 커지면 커질수록 while문을 많이 사용하여 리소스를 많이 소모하게됩니다.

 

 

 

 

2. buffer

stream 대신 buffer을 사용하여 파일을 복사하는 방식입니다.

stream 보다 buffer가 성능적으로 더 빠르다고 합니다.

buffer을 사용하는 것도 while문을 사용하는 방식이므로 리소스를 많이 소모하게 됩니다.

3. channel

stream과 buffer의 리소스에 대한 문제를 해결하기 위해 나온 기법입니다.

IO는 비교적 매우 느린 작업입니다.

IO를 빨리 처리하기 위해서 자바에서는 OS가 제공해주는 nio 기법을 사용합니다.

예제 코드를 한번 살펴보겠습니다.

===============================================================

String org_file = "org.txt";

String copy_file = "copy.txt";

 

FileChannel in = new FileInputStream(org_file).getChannel();
FileChannel out = new FileOutputStream(copy_file).getChannel();

 

in.transferTo(0, (int)in.size(), out);

 

in.close();

out.close();

=============================================================== 

 

소스도 stream이나 buffer 보다 간결하네요

테스트를 해보진 않았지만, 다른 블로그를 참고해보면 nio ( channel )를 이용한 방식이 제일 빠르다고 합니다.

오늘 포스팅은 여기까지 입니다.

감사합니다.

728x90
반응형

'프로그래밍 > JAVA' 카테고리의 다른 글

[JAVA] 파일 이동 방법  (0) 2020.10.19
[JAVA] final 이란  (0) 2020.10.13
[JAVA] 문자열 붙이기  (0) 2020.09.23
[JAVA] JVM 메모리 설정  (0) 2020.04.14
[JAVA] Maven으로 build시 생성되는 파일명 변경  (0) 2020.04.13