반응형
자바 파일 입출력 NIO 를 이용하여 속도를 빠르게 이용하자
파일 이동/복사 관련하여 작업을 하던중에 I/O를 사용하였는데, 속도가 너무 느리더라구요. 고작 6메가짜리를 이동/복사 하는데 말이죠. 그래서 속도를 향상시키는 방법이 뭐가 있나 찾아보던 도중에 NIO 를 알게 되었습니다.
NIO 란?
자바 4 버전부터 새로운 입출력이라는 (New Input/Output) 의 약어로 NIO 패키지를 포함 시키면서 나오게 되었습니다. 이후에 자바7에서는 비동기 채널등의 네트워크 지원을 강화시킨 NIO 2 API 가 추가되었죠. 일반 IO 와 그러면 어떠한 차이점이 있을까요?
구분 |
IO |
NIO |
입출력 |
스트림 |
채널 |
비동기 |
지원안함 |
지원함 |
블로킹 / 논블로킹 |
블로킹만 |
모두 지원 |
이렇게만 보아도 NIO 가 훨씬 좋다는걸 느끼시죠?
IO는 스트림기반이기에 데이터를 FileInputStream 하여 읽기위해 일일히 스트림을 생성해야되는 반면, NIO는 채널방식으로 양방향 입출력이 가능하죠. 또한 NIO는 기본적으로 복수개 단위의 버퍼를 사용해서 입출력을 하기 때문에 속도가 빠릅니다. 하지만 기존 IO는 바이트단위로 입출력을 하기 때문에 훨씬 느리죠. 여기서 속도의 차이가 난다고 보시면 되겠습니다. 자 이제 소스코드를 보시면 더 빨리 이해가 될껍니다.
NIO 파일복사
// 파일 복사하는 메소드
public boolean nioFileCopy(String inFileName, String outFileName) {
Path source = Paths.get(inFileName);
Path target = Paths.get(outFileName);
// 사전체크
if (source == null) {
throw new IllegalArgumentException("source must be specified");
}
if (target == null) {
throw new IllegalArgumentException("target must be specified");
}
// 소스파일이 실제로 존재하는지 체크
if (!Files.exists(source, new LinkOption[] {})) {
throw new IllegalArgumentException("Source file doesn't exist: "
+ source.toString());
}
try {
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); // 파일복사
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
if (Files.exists(target, new LinkOption[] {})) { // 파일이 정상적으로 생성이 되었다면
// System.out.println("File Copied");
return true; // true 리턴
} else {
System.out.println("File Copy Failed");
return false; // 실패시 false
}
}
NIO 파일 삭제
//파일 이동하는 메소드
public boolean nioFileMove(String inFileName, String outFileName) {
Path source = Paths.get(inFileName);
Path target = Paths.get(outFileName);
if (source == null) {
throw new IllegalArgumentException("source must be specified");
}
if (target == null) {
throw new IllegalArgumentException("target must be specified");
}
if (!Files.exists(source, new LinkOption[] {})) {
throw new IllegalArgumentException("Source file doesn't exist: "
+ source.toString());
}
try {
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING); // 파일이동 // 이동
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
if (Files.exists(target, new LinkOption[] {})) {
// System.out.println("File Moved");
return true;
} else {
System.out.println("File Move Failed");
return false;
}
}
패키지는 import java.nio.file.*; 쓰시면 될꺼에요. 의문점 있으시면 댓글 환영합니다. ㅎㅎ
반응형