본문 바로가기
IT/JAVA

NIO 이용 파일 카피

by 최고영회 2013. 12. 21.
728x90
반응형
SMALL

보통 개발을 할떄, 파일 카피할 일은 종종 있고, 대부분 그 회사에 만들어진 라이브러리가 있거나 없으면 웹 검색해서 개발하는데

 

기존에는 보통 버퍼를 지정하고 카피를 합니다. 안그럼 겁나 느리거든요. 특히 큰 파일 같은 경우는요.

 

따로 버퍼 지정할 필요 없이 NIO를 이용해서 카피 하는 소스 입니다.

 

 

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

public class FileCopyExec {

 public static void main(String[] args) {
  
  String fromFileName = "D:\\자료실\\Disk3.zip";
  String toFileName = "D:\\자료실\\test.zip";
  
  try {
   FileCopyUtil.fileCopy(fromFileName , toFileName);
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }
 
}

class FileCopyUtil {
 
 public static void fileCopy(String fromFileName, String toFileName) throws IOException {
  
  FileInputStream fis=null;
  FileOutputStream fos=null;
  FileChannel fcIn=null;
  FileChannel fcOut=null;
  
  try {
   
   //카피할 원본 파일의 스트립을 열어버립니다.
   fis = new FileInputStream(fromFileName);
   //카피할 곳의 위치의(파일) 스트림을 열어버립니다.
   fos = new FileOutputStream(toFileName);
   
   // 입력스트림 , 출력스트림 각각의 파일 채널을 가지고 옵니다.
   fcIn = fis.getChannel();
   fcOut = fos.getChannel();
   
   //입력스트림으로 부터 가져온 파일채널에서 이 메소드를 호출하면 , 지가 알아서 버퍼해가지고 카피해버립니다. 
   fcIn.transferTo(0, fcIn.size(), fcOut);
   
  } catch (IOException e) {
   
   throw e;
    
  }finally {
   
   if(fcOut!=null) fcOut.close();
   if(fcIn!=null) fcIn.close();
   if(fos!=null) fos.close();
   if(fis!=null) fis.close();
   
  }
 }
 

 

핵심은  fcIn.transferTo(0, fcIn.size(), fcOut);  이 메소드 호출 입니다.

지가 알아서 다 해줍니다.

 

첫번째 인자는 시작위치 입니다.

두번째 인자는 사이즈 입니다.

세번째 인자는 출력될 파일채널입니다.

 

더 좋은 방법이 있다면 알려주세요.

 

 

아래는 transferTo() 메소드의 상세입니다.

 

Transfers bytes from this channel's file to the given writable byte channel.

An attempt is made to read up to count bytes starting at the given position in this channel's file and write them to the target channel. An invocation of this method may or may not transfer all of the requested bytes; whether or not it does so depends upon the natures and states of the channels. Fewer than the requested number of bytes are transferred if this channel's file contains fewer than count bytes starting at the given position, or if the target channel is non-blocking and it has fewer than count bytes free in its output buffer.

This method does not modify this channel's position. If the given position is greater than the file's current size then no bytes are transferred. If the target channel has a position then bytes are written starting at that position and then the position is incremented by the number of bytes written.

This method is potentially much more efficient than a simple loop that reads from this channel and writes to the target channel. Many operating systems can transfer bytes directly from the filesystem cache to the target channel without actually copying them.

 


728x90
반응형
LIST

'IT > JAVA' 카테고리의 다른 글

Java 객체 직렬화  (0) 2013.12.21
Java ProcessBuilder, Runtime,, linux 에서 사용하기  (0) 2013.12.21
Java 로 mail 보내기  (0) 2013.12.21
자바 서버 소켓 멀티 쓰레드  (0) 2013.12.21
EJB  (0) 2013.12.21