💡
스트림(Stream)
은
단일 방향(출발지 → 도착지)
으로 연속적으로 흘러가는 것- 데이터의 흐름 또는 연결 통로
프로그램이 출발지냐 또는 도착지냐에 따라 스트림의 종류가 결정된다.
- 프로그램이 데이터를 입력받을 때에는
입력 스트림(Input Stream)
- 프로그램이 데이터를 보낼 때에는
출력 스트림(Output Stream)
단방향
이므로 하나의 스트림으로 입력과 출력을 모두 할 수 없다.자바의 기본적인 데이터 입출력 API는
java.io
패키지에서 제공하고 있다.
java.io
패키지에는 파일 시스템의 정보를 얻기 위한 File 클래스
와 데이터를 입출력하기 위한 다양한 입출력 스트림 클래스
를 제공하고 있다.
바이트 기반 스트림
과 문자 기반 스트림
, 두 종류로 구분된다.바이트 기반 스트림
: 모든 종류의 데이터(그림, 멀티미디어, 문자 등) 받고 보낼 수 있음.문자 기반 스트림
: 오로지 문자만 받고 보낼 수 있도록 특화되어 있음.바이트 기반 입력 스트림의 최상위 클래스로 추상 클래스이다.
모든 바이트 기반 입력 스트림은 이 클래스를 상속받아서 만들어진다.
입력 스트림으로부터 1바이트를 읽고 4바이트
int
타입으로 리턴한다.
따라서 리턴된 4바이트 중 끝의 1바이트에만 데이터가 들어 있다.
-1
을 리턴한다.InputStream is = new FileInputStream("C:/test.jpg");
int readByte;
while ((readByte=is.read()) != -1) { ... }
입력 스트림으로부터 매개값으로 주어진 바이트 배열의 길이만큼 바이트를 읽고 배열에 저장한다. 그리고 읽은 바이트 수를 리턴한다.
-1
을 리턴한다.InputStream is = new FileInputStream("C:/test.jpg");
int readByteNo;
byte[] readBytes = new byte[100];
while ((readByteNo=is.read(readBytes)) != -1) { ... }
입력 스트림으로부터 100개의 바이트가 들어온다면 read()
메소드는 100번을 루핑해서 읽어들여야 한다. 그러나 read(byte[] b)
메소드는 한 번 읽을 때 매개값으로 주어진 바이트 배열 길이만큼 읽기 때문에 루핑 횟수가 현저히 줄어든다. 그러므로 많은 양의 바이트를 읽을 때는 read(byte[] b)
메소드를 사용하는 것이 좋다.
입력 스트림으로부터
len
개의 바이트만큼 읽고, 매개값으로 주어진 바이트 배열b[off]
부터len
개까지 저장한다. 그리고 읽은 바이트 수인len
개를 리턴한다.
len
개보다 작을 경우 읽은 수만큼 리턴한다.-1
을 리턴한다. read(byte[] b)
와의 차이점은 len
매개값으로 조절할 수 있고, off
를 0
으로, len
을 배열의 길이로 준다면 read(byte[] b)
와 동일하다.//read(byte[] b)
InputStream is = ...;
byte[] readBytes = new byte[100];
int readByteNo = is.read(readBytes);
// read(byte[] b, int off, int len)
InputStream is = ...;
byte[] readBytes = read byte[100];
int readByteNo = is.read(readBytes, 0, 100);
InputStream을 더 이상 사용하지 않을 경우에는
close()
메소드를 호출해서InputStream
에서 사용했던 시스템 자원을 풀어준다.
is.close()
바이트 기반 출력 스트림의 최상위 클래스로 추상 클래스이다.
모든 바이트 기반 출력 스트림 클래스는 이 클래스를 상속받아서 만들어진다.
매개 변수로 주어진 int 값에서 끝에 있는 1바이트만 출력 스트림으로 보낸다.
OutputStream os = new FileOutputStream("C:/test.txt");
byte[] data = "ABC".getBytes();
for (int i = 0; i < data.length; i++) {
os.write(data[i]); //"A", "B", "C"를 하나씩 출력
}
매개값으로 주어진 바이트 배열의 모든 바이트를 출력 스트림으로 보낸다.
OutputStream os = new FileOutputStream("C:/test.txt");
byte[] data = "ABC".getBytes();
os.write(data); //"ABC"를 모두 출력
b[off]
부터len
개의 바이트를 출력 스트림으로 보낸다.
OutputStream os = new FileOutputStream("C:/test.txt");
byte[] data = "ABC".getBytes();
os.write(data, 1, 2); //"BC"만 출력
출력 스트림은 내부에 작은 버퍼(buffer)가 있어서 데이터가 출력되기 전에 버퍼에 쌓여있다가 순서대로 출력된다.
flush()
메소드는 버퍼에 잔류하고 있는 데이터를 모두 출력시키고 버퍼를 비우는 역할을 한다. flush()
메소드를 마지막으로 호출하여 버퍼에 잔류하는 모든 데이터가 출력되도록 해야 한다.OutputStream
을 더 이상 사용하지 않을 경우에는 close()
메소드를 호출해서 OutputStream
에서 사용했던 시스템 자원을 풀어준다.OutputStream os = new FileOutputStream("C:/test.txt");
byte[] data = "ABC".getBytes();
os.write(data);
os.flush();
os.close();
이것이 자바다 책
http://www.tcpschool.com/java/java_io_stream
https://joolog.tistory.com/entry/21-JAVA-IO-Input-Output-%ED%8C%8C%EC%9D%BC-%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%8A%A4%ED%8A%B8%EB%A6%BC-%ED%8C%8C%EC%9D%BC-File-%ED%81%B4%EB%9E%98%EC%8A%A4