파일 복사.

우리가 만들 프로젝트는 파일 복사 기능은 일단 들어가지 않는다고 봐야 정상일 것이다.

그러나 개인적인 생각으로는 이 부분이 쓰일지도 모른다는 생각을 했다.

업데이트를 할 경우에 기존에 파일의 내용을 바꾸는 것을 할 것인가?

아니면 다운로드 받아서 강제로 변경을 할 것인가?

그외에 클라이언트 쪽에 프로그램에 이상이 생겼을 경우 서버로부터 손상 또는 삭제된 파일을

복구할 것인가?

뭐 이런 생각들 때문에 파일 복사 예제를 쉽게 생각하고 넘기기엔 무리가 있다고 생각이 된다.

그리고 이상하게 파일 복사에 관한 내용이 진도가 빨랐는지 잠시 멍을 때렸는지 이해가 부족해서

학습의 효과도 보고자 이렇게 프로젝트 진행에 넣기로 했다.

그럼 일단 파일을 복사하는 방법에 대해서 잠깐 이야기 해보자.

파일을 복사하는 것은 파일을 읽어서 다시 쓰기를 하는 방식이 가장 쉽다.

여기서 종류가 있다면 그냥 읽어다 쓸 것인가? 아니면 버퍼를 이용할 것인가?

바로 두 가지로 나뉠 수도 있다. 그러나 버퍼를 쓰는 쪽을 선택하는 것이 좋다.

그 이유는 문자입력 때 이야기를 했을지도 모르겠지만 버퍼를 이용하면 여러가지로 편한 장점을 갖고 있다.
(그 정보는 API를 참고 하길 바란다.)

그리고 자바 관련 블로그에서는 버퍼를 사용하느냐 안하느냐 또 다른 방식을 취하는 복사 방법에 대해서

효율과 하드웨어적인 측면까지 이야기 하고 있는데 그정도는 바라지 않는다 -_-;(일단 지금은 무리다.)

자 그럼 이제 버퍼를 이용한 방법에 대해서 이야기 하자.

소스의 일부분만 공개하겠다. 전체 소스는 자바 예제에 올리도록 하겠다.

File f1 = new File("ttt.txt");
File f2 = new File("ccc.txt");
//파일의 원본과 복사될 대상 파일을 위해 선언. 
   
BufferedInputStream input = new BufferedInputStream(new FileInputStream(f1));
BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(f2));
// 어려워 보이지만 구조는 키보드입력을 받아 들이는 것과 동일한 구조를 취한다.


int bytesRead = 0;
byte buffer[] = new byte[64];


while((bytesRead = input.read(buffer, 0, 64)) != -1){
    output.write(buffer, 0, bytesRead);
}

위에 소느 중 붉은 색으로 표시 한 부분은 별도 설명을 하기 위해서 색을 입혀줬다. -_-;

파일 복사에 대해서 잘 이해가 안되는 사람은 위에 검정색 부분도 이해가 어려울 것이다.
그러나 일단 버퍼를 사용한다는 구조를 생각 할 때는 키보드입력 예제 때와 비슷하기 때문에
전체적으로 해석을 해본다면 이해가 되는건 시간 문제가 아닐까 한다.
(참고, 바이트 스트림의 계층구조를 한번 보시길..)

그럼 본격적으로 붉은 색을 칠해둔 부분에 대해서 이해하도록 하자.

int 형 변수 0을 선언 했다. 왜일까?
-> 굳이 int 형을 하지 않아도 된다고 생각되는 부분이다. 이후 조건문에서 읽어 들인 내용을
bytesRead에 넣고 -1과 비교하게 된다. 그러나 실제로 읽어들이진 않고 바이트 수를 센다.
(-1은 잠시후 그 정체를 알려주겠다.)

byte 라는 변수! 처음본다. 그러나 byte는 변수다. 그러나 지금은 배열을 사용하고 있다.
-> 데이터를 읽어 들이기 위해서 선언하는 것이다.

자 그럼 조건문을 해석해보자.

골 때린다. 뭘까 하는 생각이 들 수도 있다. 일단 어딘가에 대입을 해서 -1과 비교를 하는데
그 속에서 참 봐도 이해가 잘 안되는 것도 존재 한다.

여기서 -1과 왜 비교를 하는 것일까? 이 정보는 API를 보면 당연히 나와 있겠지만 여기서 알려주겠다.
간단히 말하자면 더 이상 읽을 데이터가 없다면 -1을 bytesRead에 넣는다.
즉 읽을 것이 없다. 라는 뜻이다. 그렇기 때문에 -1과 비교를 하면 조건이 거짓이 되므로 파일 복사 과정을 끝내는 것이다.

그럼 (buffer, 0, 64) 이녀석 묘하게 모르겠다. 본인도 열심히 API를 봤으나
buffer로 부터 최대로 64바이트 까지 읽어들인다, 파일의 마지막은 -1이다.

이정도 까지 밖에 이해를 못한 상태다.

그리고 파일을 쓰는 write 부분도 API를 차고 했다. 내용은 비솟하다.
이번엔 조금 다른 소스 형태를 취하고 있는데 이유는 읽어 들인 바이트 수 만큼 저장을 하기 위해서다.

여기까지가 이번 블로그의 이야기다.
이번 글에서는 부족한 부분이 분명 많다. 이 점에 대해서는 향후 보충 글이 필요하다고 느껴진다.
왜 일까? 난 멍 때린 기억이 없는데 이해가 잘 안되는 것은..

그리고 위에 소스는 다른 사람의 블로그에서 본 것을 토대로 API를 참고해서 이해한 것이다.

이 글과 관련있는 글을 자동검색한 결과입니다 [?]

by 만성피로 | 2008/09/16 21:35 | 정리할 자료들 | 트랙백 | 덧글(1)

트랙백 주소 : http://maydaisy.egloos.com/tb/835051
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 김교수 at 2008/09/16 22:14
아...좋은 글입니다. 본인이 공부한 내용이 살아 움직이네요.^^

:         :

:

비공개 덧글

◀ 이전 페이지다음 페이지 ▶