자바 파일 복사 방법
- Stream
FileInputStream inputStream = new FileInputStream(file); FileOutputStream outputStream = new FileOutputStream(saveFullPath); int bytesRead = 0; byte[] buffer = new byte[1024]; while ((bytesRead = inputStream.read(buffer, 0, 1024)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.close(); inputStream.close(); |
- 문제점 : 파일크기( 정확히는 스트림의 길이 ) 만큼 while문을 돌면서 끊임없이 읽고쓰기를 반복 중 -> CPU, DISK에 모두 부담
- 해결 방법 : 스트림을 버퍼에 장착(wrapping, chainning ) 하여 입출력 회수를 줄여보자 => 2번
- Buffer
FileInputStream inputStream = new FileInputStream(file); FileOutputStream outputStream = new FileOutputStream(saveFullPath); BufferedInputStream bin = new BufferedInputStream(inputStream); BufferedOutputStream bout = new BufferedOutputStream(outputStream); int bytesRead = 0; byte[] buffer = new byte[1024]; while ((bytesRead = bin.read(buffer, 0, 1024)) != -1) { bout.write(buffer, 0, bytesRead); } bout.close(); bin.close(); outputStream.close(); inputStream.close(); |
- Stream에 Buffer Filter를 장착
- 문제점 : 데이터를 전송하는데 항상 CPU 연산을 필요로 한다. ( 정확히 어떤 연산을 하는거지? )
- 해결 방법 : 컴퓨터의 입장에서 IO는 느린 작업중 하나이기 때문에 OS의 native IO 기능을 활용하자. => 3번
- Channel
FileInputStream inputStream = new FileInputStream(file); FileOutputStream outputStream = new FileOutputStream(saveFullPath); FileChannel fcin = inputStream.getChannel(); FileChannel fcout = outputStream.getChannel(); long size = fcin.size(); fcin.transferTo(0, size, fcout); fcout.close(); fcin.close(); outputStream.close(); inputStream.close(); |
- JDK 1.4 이상 부터 사용가능한 nio 패키지
'Java' 카테고리의 다른 글
디자인 패턴 1 - 파사드 패턴(facade pattern) (0) | 2019.03.03 |
---|---|
NIO 제대로 파해쳐보자 (0) | 2017.12.05 |
#java.util.ConcurrentModificationException 이슈 (0) | 2017.10.30 |
Memory leak 문제 해결 (0) | 2017.09.18 |
ClassNotFoundException ( 클래스 로더 정리 ) (0) | 2017.09.14 |