반응형

일반복사와 버퍼사용복사

public class BufferApplication {
    static int data = -1;

    // TODO : 정적(전역, 공유)함수 : 파일 copy 함수
    public static long copy(InputStream is, OutputStream os) throws Exception {     // 예외처리
        // 복사하는데 걸리는 시간 체크 : 시작시간 체크
        long start = System.nanoTime();

        // 복사 실행 코드
        while(true) {
            data = is.read();   // 읽기(원본)
            if(data == -1) break;   // 반복문 종료 조건, 파일의 끝 : -1 리턴
            os.write(data);     // 다른 파일에 쓰기(복사본)
        }

        // 종료 시간 체크
        long end = System.nanoTime();

        return (end - start);   // 걸린시간 리턴
    }

    public static void main(String[] args) throws Exception {
        // TODO : 원본 이미지 경로 지정
        String orgImgPath = "src/main/resources/images/boy.jpg";    // 일반복사 파일
        String orgImgPath2 = "src/main/resources/images/girl.jpg";  // 버퍼복사 파일

        // TODO : 복사본 이미지 경로 지정
        String cpyImgPath = "src/main/resources/images/boy_copy.jpg";   // 일반복사 파일
        String cpyImgPath2 = "src/main/resources/images/girl_copy.jpg"; // 버퍼복사 파일

        // FileInputStream 기본 스트림 중 1개
        // TODO : 파일 읽기용으로 원본 이미지 접근
        FileInputStream fileInputStream
                = new FileInputStream(orgImgPath);
        // TODO : 파일 쓰기용으로 복사본 이미지 생성
        FileOutputStream fileOutputStream
                = new FileOutputStream(cpyImgPath);

        // TODO : 복사함수(copy)를 이용해서 복사본 이미지 생성 + 소요시간 측정(리턴)
        long nonBufferTime = copy(fileInputStream, fileOutputStream);
        System.out.println("버퍼를 사용하지 않았을때 :" + nonBufferTime + "ns");

        fileInputStream.close();
        fileOutputStream.close();


    }
}

여기서 copy 함수는 파일을 복사하는데 걸리는 시간을 체크함과 동시에 복사를 실행하는 코드입니다.

public static long copy(InputStream is, OutputStream os) throws Exception {     // 예외처리
    // 복사하는데 걸리는 시간 체크 : 시작시간 체크
    long start = System.nanoTime();

    // 복사 실행 코드
    while(true) {
        data = is.read();   // 읽기(원본)
        if(data == -1) break;   // 반복문 종료 조건, 파일의 끝 : -1 리턴
        os.write(data);     // 다른 파일에 쓰기(복사본)
    }

    // 종료 시간 체크
    long end = System.nanoTime();

    return (end - start);   // 걸린시간 리턴
}

메인함수

public static void main(String[] args) throws Exception {
        // TODO : 원본 이미지 경로 지정
        String orgImgPath = "src/main/resources/images/boy.jpg";    // 일반복사 파일
        String orgImgPath2 = "src/main/resources/images/girl.jpg";  // 버퍼복사 파일

        // TODO : 복사본 이미지 경로 지정
        String cpyImgPath = "src/main/resources/images/boy_copy.jpg";   // 일반복사 파일
        String cpyImgPath2 = "src/main/resources/images/girl_copy.jpg"; // 버퍼복사 파일

        // FileInputStream 기본 스트림 중 1개
        // TODO : 파일 읽기용으로 원본 이미지 접근
        FileInputStream fileInputStream
                = new FileInputStream(orgImgPath);
        // TODO : 파일 쓰기용으로 복사본 이미지 생성
        FileOutputStream fileOutputStream
                = new FileOutputStream(cpyImgPath);

        // TODO : 복사함수(copy)를 이용해서 복사본 이미지 생성 + 소요시간 측정(리턴)
        long nonBufferTime = copy(fileInputStream, fileOutputStream);
        System.out.println("버퍼를 사용하지 않았을때 :" + nonBufferTime + "ns");

        fileInputStream.close();
        fileOutputStream.close();

//        ------------------- 버퍼 써서 파일 복사 ------------------

        // TODO : 파일 읽기용으로 원본 이미지 접근 : girl.jpg(이미지 경로 : orgImgPath2)
        FileInputStream fileInputStream2
                = new FileInputStream(orgImgPath2);
        // TODO : 파일 쓰기용으로 복사본 이미지 생성 (이미지 경로 : cpyImgPath2 )
        FileOutputStream fileOutputStream2
                = new FileOutputStream(cpyImgPath2);

        // TODO : 보조스트림(buffer) 적용 : new 보조스트림 생성자(기본스트림)
        BufferedInputStream bufferedInputStream
                = new BufferedInputStream(fileInputStream2);    // 읽기용(원본)
        BufferedOutputStream bufferedOutputStream
                = new BufferedOutputStream(fileOutputStream2);  // 쓰기용(복사본)

        // TODO : 복사(copy)와 함께 소요시간(리턴값) 체크
        long bufferTime = copy(bufferedInputStream, bufferedOutputStream);
        System.out.println("버퍼를 사용할때 : " + bufferTime + "ns");

        // TODO : 파일 닫기
        bufferedInputStream.close();
        bufferedOutputStream.close();

    }

먼저 일반 복사를 하기 위해 원본 이미지와 복사본 이미지의 경로를 지정해줍니다.

// TODO : 원본 이미지 경로 지정
String orgImgPath = "src/main/resources/images/boy.jpg";    // 일반복사 파일
String orgImgPath2 = "src/main/resources/images/girl.jpg";  // 버퍼복사 파일

// TODO : 복사본 이미지 경로 지정
String cpyImgPath = "src/main/resources/images/boy_copy.jpg";   // 일반복사 파일
String cpyImgPath2 = "src/main/resources/images/girl_copy.jpg"; // 버퍼복사 파일

 

FileInputStream 기본 스트림을 사용하여 읽기/쓰기용으로 생성자를 생성합니다.

// FileInputStream 기본 스트림 중 1개
// TODO : 파일 읽기용으로 원본 이미지 접근
FileInputStream fileInputStream
        = new FileInputStream(orgImgPath);
// TODO : 파일 쓰기용으로 복사본 이미지 생성
FileOutputStream fileOutputStream
        = new FileOutputStream(cpyImgPath);

메인함수 위에서 코딩하였던 복사함수를 이용하여 복사본 이미지를 생성하고 소요시간을 측정합니다.

// TODO : 복사함수(copy)를 이용해서 복사본 이미지 생성 + 소요시간 측정(리턴)
long nonBufferTime = copy(fileInputStream, fileOutputStream);
System.out.println("버퍼를 사용하지 않았을때 :" + nonBufferTime + "ns");

마무리로 파일을 닫아줍니다.

fileInputStream.close();
fileOutputStream.close();

일반 복사를 실행하였을 경우 실행속도는 다음과 같습니다.

버퍼를 사용하지 않았을때 :112719101ns

 

다음은 버퍼를 사용하여 파일을 복사해보겠습니다.

 

먼저 파일 읽기/쓰기용으로 이미지 접근, 복사본 이미지 생성 생성자를 코딩합니다.

// TODO : 파일 읽기용으로 원본 이미지 접근 : girl.jpg(이미지 경로 : orgImgPath2)
FileInputStream fileInputStream2
        = new FileInputStream(orgImgPath2);
// TODO : 파일 쓰기용으로 복사본 이미지 생성 (이미지 경로 : cpyImgPath2 )
FileOutputStream fileOutputStream2
        = new FileOutputStream(cpyImgPath2);

 

보조스트림을 적용합니다.

보조스트림 적용은 new 보조스트림 생성자안에 매개변수로 기본스트림을 넣어주는 형태입니다.

// TODO : 보조스트림(buffer) 적용 : new 보조스트림 생성자(기본스트림)
BufferedInputStream bufferedInputStream
        = new BufferedInputStream(fileInputStream2);    // 읽기용(원본)
BufferedOutputStream bufferedOutputStream
        = new BufferedOutputStream(fileOutputStream2);  // 쓰기용(복사본)

 

다음은 copy함수를 사용하여 소요시간을 측정합니다.

// TODO : 복사(copy)와 함께 소요시간(리턴값) 체크
long bufferTime = copy(bufferedInputStream, bufferedOutputStream);
System.out.println("버터를 사용할때 : " + bufferTime + "ns");

마무리로 파일을 닫아줍니다.

// TODO : 파일 닫기
bufferedInputStream.close();
bufferedOutputStream.close();

 

버퍼를 사용하였을 때 복사소요시간은 다음과 같습니다.

버퍼를 사용할때 : 2299000ns

 

즉, 일반 복사를 할 때보다 버퍼를 사용하여 복사하였을 때 성능향상이 있는 것을 알 수 있습니다.

 

버퍼를 사용하지 않았을 때(일반복사) 118145200ns
버퍼를 사용하였을 때 (버퍼 사용 복사) 2299000ns

 

반응형

'Java > Java 이론' 카테고리의 다른 글

printstream  (0) 2023.10.02
보조스트림 : 기본 자료형으로 입출력하기  (0) 2023.10.02
보조스트림  (0) 2023.09.27
입출력 Stream  (0) 2023.09.27
Arrays 클래스  (0) 2023.09.27

+ Recent posts