반응형
일반복사와 버퍼사용복사
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 |