brunch

You can make anything
by writing

C.S.Lewis

JAVA I.O. - 파일 쓰기

* 이 내용은 철저히 초심자를 위해 알기 쉽게 설명하는 것을 목적으로 하고 있습니다.

* 더 정확하고 자세한 개념은 다른 고수님들의 글들을 참고하시길 바랍니다.

* 그리고 이 글에서는 코드 최소한으로 다루고 있습니다.


파일 쓰기

이번에는 시스템에 있는 문자열을 파일로 내보내볼까요? C:/ 에 file.txt라는 파일 안에 특정한 문자를 추가해 보겠습니다. 자바 안의 문자를 특정한 파일에 저장할 때 어떤 절차가 있는지 확인해 볼까요?

1. 저장할 파일의 위치를 확인시켜 줍니다.

2. 자바 밖으로 내보낼 스트림을 준비합니다.

3. 자바 안의 문자열을 스트림을 통해 흘려보냅니다.

4. 모든 과정이 끝나면 스트림을 반납해 줍니다.

이 순서를 잘 기억하세요!


그리고 이것을 코드로 표현해 보겠습니다. 이번에도 역시 ‘이런 거 구나 ‘하는 감만 가져가는 겁니다.

1번에서 저장할 파일의 위치를 지정하여 File 객체를 생성했습니다. 

2번에서는 밖으로 내보낼 스트림을 준비합니다. 우리는 문자열을 내보낼 예정이므로 문자열로 이루어진 파일을 쓰기에 특화된 FileWriter를 사용할 것입니다.

FileWriter() 안의 두 개에 매개변수는 저장할 파일의 정보가 담긴 객체 그리고 기존파일에 이어서 쓸 것인지 여부를 넣는 것입니다.


3번은 “Hello, JAVA I.O.”라는 문자열을 스트림을 통해 내보내는 작업입니다. 뒤의 \r\n 은 줄 바꿈을 의미하는 특수문자입니다. 그리고 4번에서 다 쓴 스트림을 반납합니다.


이렇게 특정 문자열을 시스템 밖으로 내보내 파일에 저장까지 해 보았습니다만, 아직 끝나지 않았습니다.

사용한 스트림(파이프)도 반납해 줬는데 뭘 더 해야 하냐고요? 바로 flush라는 작업입니다.

flush는 쉽게 말해 저 파이프안에 남아있는 작은 물방울(데이터)이라도 남아있지 않게 모두 비워내는 것을 의미합니다. 다른 예로는 쓰레기통을 비울 때 뒤집어 탈탈 터는 것이 있겠네요.


왜 이런 작업을 해 주는 것일까요? 

만약 파이프를 통해 내용물이 나오고 있는데 다 나오기 전에 파이프를 치운다면 어떻게 될까요?

온전한 내용이 다 나오지 못할 것입니다. 그리고 파이프 안에는 내용이 이물질처럼 남아 있겠죠?

그래서 마지막에 남은 내용이 있는지 확인하여 모두 비워내야 합니다.


그래서 이렇게 스트림을 반납하기 전에 스트림 내부에 있는 내용을 탈탈 털어서 비워내줘야 합니다.


이번에도 전체 코드를 한번 보겠습니다.

이런 간단한 몇 줄만으로 파일로부터 무언가를 읽어오고 쓸 수 있다는 것이 정말 신기하지 않나요?


복사 붙여 넣기

우리가 일명 복. 붙.이라는 것을 생각해 보면 특정한 파일을 읽어 들여 다른 이름으로 다른 곳으로 파일을 저장하는 것을 의미합니다. 그래서 복사+붙여 넣기가 되는 것이죠!

우리가 앞서 배운 파일로부터 읽기와 특정 파일에 쓰기 기능을 활용하면 충분히 가능합니다. 어떠한 방식으로 이루어지는지 한번 보겠습니다.

1. 가져올 파일을 객체화 합니다.

2. 이 파일을 읽어올 스트림을 준비합니다. 그리고 읽어 들이기 시작합니다.

3. 읽어 들인 내용은 자바의 변수나 배열 등에 저장해 줍니다. 

4. 그리고 다 쓴 스트림은 반납해 줍니다.


5. 내보낼 위치의 파일 객체를 준비해 줍니다.

6. 그리고 내보낼 스트림을 준비해 줍니다.

7. 아까 읽어온 내용을 내보낼 스트림을 통해서 내보내 줍니다.

8. 스트림을 flush를 통해 깔끔하게 비운다음 닫아서 반납해 줍니다.

이번에는 FileReader 나 FileWriter를 사용하지 않았죠? 바로 읽어오고 써야 할 내용이 문자가 아니라 이미지이기 때문이라서 그렇습니다. 이미지는 문자가 아닌 1과 0으로 이루어진 바이너리입니다. 그렇기 때문에 문자를 취급하는 스트림으로는 읽거나 불렀을 때 데이터가 깨질 수 있겠죠?

이처럼 무언가를 불러오고 내보낼 때는 그 용도에 적합한 스트림을 사용해야 합니다. 하수도에서 사용하는 파이프를 상수도에 이용할 순 없는 것과 마찬가지죠!


이렇게 스트림을 이용해 파일로부터 데이터를 읽어오고 내보내는 것에 대해서 알아보았습니다.

코드만 본다면 어렵겠지만 이렇게 주요 과정을 이해하면서 본다면 그리 어려운 것도 아닙니다.

매거진의 이전글 JAVA I.O. - 파일 읽기
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari