InputStream / Reader
InputStream : byte단위의 데이터 읽기 (1byte단위 처리 : 이미지나 데이터를 주고 받을때 많이 사용)
Reader : char단위의 데이터 읽기 (2byte인 char단위 : 주로 문자열을 주고 받는 프로그래밍 할때)
클래스 이름이 InputStream으로 끝나는 경우
무조건 데이터를 읽어내는 기능을 하는 클래스라고 생각하면 됨
- FileInputStream :파일에서 데이터를 읽어들이는 기능을 가진 클래스
- ZipInputStream : zip파일에서 데이터를 읽어들이는 기능을 가진 클래스
I/O 프로그래밍의 절차
1. 원하는 대상을 정한다.
2. 계열 객체를 구한다.
3. 대상에 적절한 InputStream 계열의 파이프나 OutPutStream계열의 파이프를 연결
4. 대상에서 읽거나 쓰기 작업을 한다.
5. 모든 작업후에는 반드시 close()해서 파이프 연결 종료
InputStream에서 반드시 기억해야할 메소드 read()
1. 한바이트의 데이터를 읽음
2. 원하는 대상에서 데이터를 읽어내기 위해서 빨대를 연결하는 것처럼 InputStream을 연결하는 작업 필요
3. 연결된 파이프를 통해서 read()해 주면 한 byte내용을 int타입으로 읽어냄
- 숫자가 양수가 나올 수 있도록 내부적으로 조치함
- 이때 int값이 -1일 경우 데이상 읽어낼 데이터가 없는 경우
read() -> int : 한 byte에 쓰여진 데이터
read(byte[]) -> int : 읽어낸 데이터는 byte[]안으로 들어가고 int는 몇개나 새로운 데이터가 읽어냈는지를 말한다.
read(btte[]) 메서드는 한번에 byte[]만큼씩 데이터를 읽어냄
: 한번에 4byte를 읽어들이는 보관장치(버퍼)
OutputStream : 바이트의 데이터를 기록할 수 있다.
구하는 방식 두가지
1. 어떤 클래스의 형태로 제공되는 경우
2. 어떤 클래스의 어떤 메서드의 실행결과로 OutputStream 계열로 반환해주는 경우
OutputStream 의 핵심기능 - Write()
- 연결된 파이프를 통해서 write(int) 해주면 대상으로 데이터를 전송
- write() -> int : 한 byte에 쓰여진 데이터
- write(byte[]) -> int :읽어낸 데이터는 byte[]안으로 들어가고 int는 몇개나 새로운 데이터가 읽어냈는지를 말한다.
- write(byte[], int, int) -> byte[]안에 있는 데이터들을 시작위치에서 몇개의 갯수만큼 데이터를 기록
OutputStream의 기능 flush()
- 스트림에 기록된 데이터를 확실히 보내 버릴때 사용하는 메서드
문자열을 손쉽게 byte[]로 변환할수 있는 메서드 : getBytes();
파일복사 프로그램의 원리와 실습
1. 원본파일에는 FileInputStream 계열로 연결
2. 복사해서 생성할 대상에는 FileOutputStream계열 파이프 연결(작성)
3. 원본에서 데이터를 읽어낸다(read)
4. 대상에서 읽어낸 데이터를 출력한다 (write)
5. 더 이상 읽을 데이터가 없으면 모든 연결을 close()한다.
파일을 한번에 읽고 한번에 쓰는 방법 :byte[]를 이용
빠르고 정확한 파일 복사를 위해서 사용
- write(byte[], int, int) : 앞으로 모든 java IO 프로그래밍에서 공통적으로 신경써야하는 코드
- int count = in.read(buffer);
: count변수를 통해 새로이 읽어온 데이터의 개수를 정확히 알 수 있게 되어있음
: count결과를 이용해서 그 개수만큼만 데이터를 기록
byte[] :실제 데이터가 담겨있는 byte[]
int : byte[] 내에서 데이터를 기록할 시작의 인덱스 번호
int : byte[] 내에서 몇개의 숫자를 기록할지 정하는 번호
ServletOutputStream
: Provides an output stream for sending binary data to the client. A ServletOutputStream object is normally retrieved via the ServletResponse.getOutputStream() method.
This is an abstract class that the servlet container implements. Subclasses of this class must implement the java.io.OutputStream.write(int) method.
close, flush, write, write, write : Methods inherited from class java.io.OutputStream