Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

InputStream, OutputStream으로 파일 이동하기

대부분의 웹사이트에는 게시판 등에 파일업로드가 들어가기 때문에 파일을 지우거나 삭제하는 기능이 필요했다.(솔직히 전에는 빡빡한 일정과 사이트 분위기 봐서 무시해버린것도 사실인데.. ㅎ) 이런저런 상황에서도 필요할테고 나같은 경우에는 파일업로드하고(cos.jar가 일단 다 업로드를 해버리니까...) 확장자같은 거 등 유효성을 체크해서 통과한 파일만 실제 폴더에 옮겨주고 나머진 지워준다. 임시폴더는 어차피 외부로 공개도 안될테니... ㅎ


// 파일을 해당위치로 복사하고 지운다.
public boolean moveFile(String source, String dest) {
    boolean result = false;
        
    FileInputStream inputStream = null;
    FileOutputStream outputStream = null;
        
    try {
        inputStream = new FileInputStream(source);
        outputStream = new FileOutputStream(dest);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        result = false;
    }
        
    FileChannel fcin = inputStream.getChannel();
    FileChannel fcout = outputStream.getChannel();
        
    long size = 0;
    try {
        size = fcin.size();
        fcin.transferTo(0, size, fcout);
            
        fcout.close();
        fcin.close();
        outputStream.close();
        inputStream.close();
            
        result = true;
    } catch (IOException e) {
        e.printStackTrace();
        result = false;
    }
        
    File f = new File(source);
    if (f.delete()) {
        result = true;
    }
    return result;
}


소스는 간단하다. 복사할 파일을 FileInputStream으로 만들고 복사할 경로를 FileOutputStream으로 만든뒤 FileChannel을 통해서 복사를 하는 것이다. 그리고 복사한 후에 파일은 삭제해준다. 함수 호출은 아래와 같이 한다.

moveFile(fileObj.getAbsolutePath(), saveDirectory + "/downloads/" + fileName);

파일복사기 때문에 서버의 절대/상대 경로가 아닌 물리적 절대경로가 되어야 한다. fileObj는 File객체이고 saveDirectory는 저장경로의 물리적 경로가 저장되어 있다. fileName은 fileObj객체의 파일명이 저장되어 있다.

saveDirectory는 아래처럼 서버의 경로를 주어서 물리적인 절대경로를 구한다.

saveDirectory = config.getServletContext().getRealPath("/temp");

위의 파일복사 소스는 서비님자바 파일복사 코드와 성능 1을 참고해서 작성하였다.(이런류의 소스가 사용하는 방식이 거의 고정되어 있다고는 생각하지만 참고수준을 넘어서서 그냥 그대로 갔다가 약간만 상황에 맞게 고쳤다 ㅡ..ㅡ 보통은 참고한것과 개발하면서 알게된 것을 복합적으로 포스팅하는 편인데 이번경우에는 소스를 많이 바뀌지 않은 관계로 간단히 소스만 보여주고 원본글의 링크로 소스설명은 대체한다.) 자세한 설명을 서비님의 글을 참고 하기 바란다. 아주 자세하게 설명을 해 놓으셨다.

서비님의 포스트에는 파일복사를 하는 3가지 종류가 나와 있는데 이곳에 사용한 것은 3번째 "Channel을 이용한 네이티브OS 기능 사용하기"를 사용한 것이다. 자바 파일복사 코드와 성능 2를 보면 파일복사의 3가지 경우에 대해서 성능테스트까지 한것을 볼수가 있는데 서비님이 추천한대로 성능이 가장 좋아보이는 "Channel을 이용한 네이티브OS 기능 사용하기"를 사용했다.

서비님의 자세한 포스트 덕분에 간단하게 해결.... 감사합니다.
2008/10/15 01:49 2008/10/15 01:49