상세 컨텐츠

본문 제목

Java - IO, File 클래스를 이용한 파일 복사

개발/Java

by 뉴에이스 2018. 10. 2. 15:31

본문

소스 (일반복사)

 

public static void main(String[] args) {
	FileInputStream fis = null;
	FileOutputStream fos = null;

	try {
		fis = new FileInputStream("data/lec13/test.mp4");
		fos = new FileOutputStream("data/lec13/test1.mp4");
		Timer t = new Timer();
		t.start();

		while(true) {
			int ch = fis.read();
			if(ch == -1) break;
			fos.write(ch);
		}
		
		System.out.println("복사에 걸린 시간 : " + t.end());

	} catch (Exception e) {
		e.printStackTrace();
	}finally {

		try {
			fis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		try {
			fos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

결과

 

복사에 걸린 시간 : 64.483

 

소스 (배열을 활용한 복사)

 

public static void main(String[] args) {
	FileInputStream fis = null;
	FileOutputStream fos = null;

	try {
		fis = new FileInputStream("data/lec13/test.mp4");
		fos = new FileOutputStream("data/lec13/test2.mp4");
		Timer t = new Timer();
		t.start();
		// 버퍼를 활용하자..
		
		byte[] buf = new byte[1024 * 32];
				
		while(true) {
			// buf 공간만큼을 한꺼번에 읽고, 쓴다
			// ch는 배열의 갯수가 입력된다
			int ch = fis.read(buf);
			if(ch == -1) break;
			// 비어있는 데이터에는 0 및 공백으로 초기화가 되기 때문에, 쓰기시에는 0부터 값이 있는곳 만큼 해야 한다
			// buf 배열의 0번째부터 배열의갯수만큼(ch) 쓰기
			fos.write(buf, 0, ch);
		}
		
		System.out.println("복사에 걸린 시간 : " + t.end());

	} catch (Exception e) {
		e.printStackTrace();
	}finally {

		try {
			fis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		try {
			fos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

결과

 

복사에 걸린 시간 : 0.007

 

소스 (Buffered를 활용한 복사)

 

public static void main(String[] args) {

	FileInputStream fis = null;
	FileOutputStream fos = null;
	// Buffered의 사용은 File In/Output과 함께 사용되어야 한다
	BufferedInputStream bis = null;
	BufferedOutputStream bos = null;

	try {
		fis = new FileInputStream("data/lec13/test.mp4");
		fos = new FileOutputStream("data/lec13/test2.mp4");
		// buffered를 fis와 연결하여 사용
		bis = new BufferedInputStream(fis);
		/*
		내부적으로 16k의 버퍼 공간을 가지고 있음
		버퍼 공간이 가득 찼을때, 데이터를 넘겨줌
		버퍼에 데이터가 가득 차지 않아도 강제 출력을 위해 flush(); 사용
		close()를 하게 되도 동일한 처리가 됨
		*/
		bos = new BufferedOutputStream(fos);

		Timer t = new Timer();
		t.start();

		while(true) {
			// 버퍼를 활용한 사용
			int ch = bis.read();
			if(ch == -1) break;
			bos.write(ch);
		}
		bos.flush();
		System.out.println("복사에 걸린 시간 : " + t.end());

	} catch (Exception e) {
		e.printStackTrace();
	}finally {
		try { // fis를통해 열린 bis 먼저 close
			bis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		try { // fos를 통해 열린 bos 먼저 close
			// 내부적으로 닫기 전에 버퍼 공간에 있는 데이터를 출력한다 (bos.flush();)
			// close 할 경우에는 flush 하지 않아도 됨
			bos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		try {
			fis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		try {
			fos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
} 

 

결과

 

복사에 걸린 시간 : 0.157

 

'개발 > Java' 카테고리의 다른 글

Java - IO, finnaly문 정리  (0) 2018.10.02
Java - IO, PrintWriter 사용  (0) 2018.10.02
Java - IO, InputStream, OutputStream  (0) 2018.10.02
Java - IO, 파일 속성 확인  (0) 2018.10.02
Java - IO, 디렉토리 하위의 목록 가져오기  (0) 2018.10.02

관련글 더보기

댓글 영역