스터디 링크
코드 링크
데이터 입출력
18.1 입출력 스트림
- 스트림은 단방향으로 데이터가 흐르는 것을 말한다.
프로그램을 기준으로 데이터가 들어오면 입력 스트림, 나가면 출력 스트림이 된다.

자바는 데이터 입출력 관련 라이브러리를 java.io에서 제공하고 있다.

18.2 바이트 출력 스트림
OutputStream은 바이트 출력 스트림의 최상위 클래스이다. 모든 바이트 클래스 스트림은 OutputStream로부터 클래스를 상속 받아서 만들어진다.

- 1바이트 출력
write메소드는 매개값에서 끝 1바이트만 출력한다.
출력 스트림을 더이상 사용하지 않을 때는 close() 메소드를 통해 메모리를 해제하는 것이 좋다.
- 바이트 배열 출력
일반적으로 1바이트를 출력하는 경우는 드물고, 보통 바이트 배열을 통째로 출력하는 경우가 많다. write(byte[])메소드는 매개값으로 주어진 모든 바이트를 출력한다.
18.3 바이트 입력 스트림
InputStream은 바이트 입력 스트림의 최상위 클래스로 모든 입력 바이트 스트림은InputStream클래스를 상속 받는다.

- 1바이트 읽기
read()메소드는 입력 스트림으로부터 1바이트씩 읽고 리턴한다. write()와 특성은 같은 반대방향 메소드라고 생각하면 된다.
- 바이트 배열 읽기
일반적으로 1바이트를 입력하는 경우는 드물고, 보통 바이트 배열을 통째로 입력하는 경우가 많다. read(byte[])메소드는 매개값으로 주어진 모든 바이트를 입력한다.
18.4 문자 입출력 스트림
- 바이트 입출력 스트림에 대응하는 입출력 스트림은 Reader,Writer가 있다.
- 문자 출력Writer 클래스

writer클래스는 outStream과 동일하지만 출력 단위가 char라는 차이점이 있다.
- 문자 읽기 Reader는 문자 입력 클래스의 최상위 클래스이다.

18.5 보조 스트림
- 보조 스트림이란 다른 스트림과 연결되어 여러가지 편리한 기능을 제공해주는 스트림을 말한다.

InputStream is = new FileInputStream("...");
InputStreamReader reader = new InputStreamReader(is);

18.6 문자 변환 스트림
- 바이트 스트림에서 입출력할 데이터가 문자라면 문자 스트림으로 변환해서 사용하는 것이 좋다.
- inputStream 을 Reader로 변환
InputStream is = new FileInputStream(",,,");
Reader reader = new InputStreamReader(is);
- OutputStream 을 Writer로 변환
위와 같은 원리로 변환 시킨다.
18.7 성능 향상 스트림
- buffer를 사용하는 것이 성능 향상 면에서 더 효율적이다.

18.8 기본 타입 스트림
- 바이트 스트림에
DataInputStream과 연결하면 기본 타입의 값으로 출력 가능하다.


18.9 프린트 스트림
- 프린터와 유사하게 출력하는 print,println,printf메소드를 가지고 있는 보조 스트림이다.

18.10 객체 스트림
- 자바는 메모리에 생성된 객체를 파일 또는 네트워크로 출력할 수 있다. 객체를 출력하려면 필드값을 일렬로 늘어선 바이트로 변경해야 하는데, 이것을 직렬화라고 한다. 반대로 직렬화된 바이트를 객체의 필드값으로 복원하는 것을 역직렬화라고 한다.
ObjectInputStream과ObjectOutputStream은 객체를 입출력할 수 있는 보조 스트림이다.

- Serializable 인터페이스
자바는 Serializable 인터페이스를 구현한 클래스만 직렬화할 수 있도록 제한한다.
- serialVersionUID 필드
직렬화할때 사용된 클래스와 역직렬화할 떄 사용된 클래스는 기본적으로 동일한 클래스여야한다.
18.11 files 클래스
File file = new File("경로");

