## 33. character stream API를 사용하여 CSV 텍스트 형식으로 입출력하기
- CSV 형식으로 데이터를 읽고 쓰는 법
- FileReader/FileWriter 사용법
SaveXxx 파일 수정
App.java
ㄴ FileWriter, BufferedWriter, PrintWriter 사용
FileWriter
ㄴ 텍스트 파일에 문자 단위로 데이터를 쓰기 위해 사용되는 클래스
ㄴ FileWriter를 사용하여 파일에 텍스트를 기록할 수 있음
BufferedWriter
ㄴ Writer 클래스를 상속받아 버퍼링 기능을 제공하는 클래스
ㄴ 버퍼링은 데이터를 일시적으로 메모리에 저장해두었다가 한 번에 파일에 쓰는 작업을 수행하여 입출력 성능을 향상시키는 역할을 함
PrintWriter
ㄴ Writer 클래스를 상속받아 텍스트를 출력하는 기능을 제공하는 클래스
ㄴ PrintWriter는 다양한 데이터 타입의 값을 문자열로 변환하여 출력할 수 있음
App.java
ㄴ 해당 코드는 필요없으므로 제거
App.java
ㄴ PrintWriter의 printf 메서드를 사용하여 형식화된 문자열을 파일에 출력
=> %d, %s, %c와 같은 포맷 지정자를 사용하여 Member 객체의 필드 값을 형식에 맞게 출력
ㄴ 주의! => 공백 띄우면 안 됨
=> Item, Board 도 동일하게 적용
App.java
ㄴ saveMember, saveItem, saveBoard 메서드에 각각 csv 형식의 파일 이름과 List 객체를 넘겨줌
실행하여 CSV 파일 형식으로 저장 후 Text Editor 이용하여 확인
=>
ㄴ .csv 형식으로 파일 저장됨
LoadXxx 파일 수정
App.java
ㄴ FileReader 와 BufferedReader 를 이용하도록 함
=> line 을 이용하여
App.java
ㄴ 해당 코드는 필요없으므로 제거
App.java
ㄴ for 문 -> while 문으로 변경 후 line 을 , 단위로 split 하도록 코드 작성
=> 파일에서 각 줄을 읽어와서 쉼표를 구분자로 사용하여 값을 분할하도록 함
App.java
ㄴ 파일에서 각 줄을 읽어와서 쉼표를 구분자로 사용하여 값을 분할하고, 새로운 Member 객체를 생성하고 추출한 값으로 해당 객체의 필드를 채우는 반복문
ㄴ 생성된 Member 객체를 list에 추가
ㄴ no, position 은 각각 int, char 값이므로 각각 캐스팅 필요 (문자열(String값)로 받아오기 때문)
ㄴ board 에서의 경우 long 타입의 값이 있으므로 Long.parseLong() 이용
ㄴ readLine() 메서드는 BufferedReader 클래스에서 제공되는 메서드로, 텍스트 파일에서 한 줄을 읽어옴
=> 파일의 끝에 도달하거나 오류가 발생할 때까지 한 줄씩 읽어옴
ㄴ 파일의 끝에 도달하면(읽은 줄이 없으면) null을 반환함
* readLine() 메서드의 동작
ㄴ 파일에서 다음 줄을 읽어오기
ㄴ 읽은 줄이 없으면(파일의 끝에 도달한 경우) null을 반환
ㄴ 읽은 줄이 있다면 문자열 형태로 반환
ㄴ 다음에 호출될 때는 파일에서 다음 줄을 읽어옴
App.java
ㄴ csv 파일을 읽어오도록 filename 을 저장된 csv 파일로 설정해줌