Stream이란
외부에서 데이터를 읽거나 외부로 데이터를 출력하는 작업이 자주 일어난다.
이때 데이터가 이동하는 통로를 Stream이라고 한다.
InputStream, OutputStream
추상 클래스이며 추상 메서드를 오버라이딩해서 역할을 수행 (예: 파일, 네트워크, 메모리 입출력)
InputStream
외부에서 데이터를 읽는 역할
바이트 기반 입력 스트림 최상위 추상 클래스
파일 데이터를 읽거나 네트워크 소켓을 통해 데이터를 읽거나 키보드에서 입력한 데이터를 읽을 때 사용.
public abstract int read() throws IOException;
입력 스트림에서 1 바이트씩 읽고 읽은 바이트를 반환한다.
데이터를 모두 읽었다면 -1을 반환
public int read(byte buffer[]) throws IOException {
return (read(buffer, 0, buffer.length);
}
입력 스트림에서 byte buffer []만큼 읽고 읽은 데이터 수를 반환.
데이터를 모두 읽었다면 -1을 반환
read() 메서드와 다른 점은 read() 메서드의 반환 값이 읽은 데이터가 아니라 읽은 데이터 수라는 점입니다.
읽은 데이터는 매개변수로 넘긴 buffer에 저장됩니다.
public int read(byte buffer[], int off, int len) throws IOException
입력 스트림에서 buffer [off]부터 len개만큼 buffer에 저장합니다.
읽은 데이터 개수를 반환하고 더 이상 읽을 데이터가 없다면 -1을 반환
len개를 읽지 못하면 실제로 읽은 데이터 수를 반환
int len = 4;
int readCnt = 0;
int offset = 0;
byte[] buffer = new byte[1024];
while ((readCnt = is.read(buffer, offset, len)) != -1) {
offset += readCnt;
for (int index = 0; index < offset; index++) {
System.out.print(buffer[index]);
}
System.out.println();
}
데이터를 4개씩 읽으며, 다시 읽을 때 배열 처음 위치가 아닌 offset위치부터 읽습니다.
offset은 읽은 데이터 수(readCnt)만큼 증가, 읽을 데이터의 수가 꼭 len값으로 나누어 떨어지지 않기 때문에 offset은 읽은 데이터 수만큼 증가해주어야 한다. (보통 네트워크 통신 시 사용)
OutputStream
외부로 데이터를 출력하는 역할
바이트 기반 출력 스트림의 최상위 추상클래스
public abstract void write(int b) throws IOException
public void write01() throws IOException {
byte[] bytes = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
File file = new File("D://write_test.txt");
OutputStream outputStream = new FileOutputStream(file);
for (byte b : bytes) {
outputStream.write(b);
}
//바이트를 한번에 넣을 수 있다.
//outputStream.write(bytes);
outputStream.close();
}
바이트 배열을 write_text.txt 파일에 write 하는 예제
OutputStream을 상속받은 FileOutputStream을 생성하고, 한 바이트씩 write 하거나 여러 바이트씩 write 할 수 있다.
public void write(byte b[], int off, int len) throws IOException
public void write() throws IOException {
byte[] bytes = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 7, 8, 7, 8, 5, 2, 4};
int len = 3;
int offset = 0;
int total = bytes.length;
File file = new File("D://write_test.txt");
OutputStream outputStream = new FileOutputStream(file);
while (total >= (offset + len)) {
outputStream.write(bytes, offset, len);
offset += len;
}
if (total - offset > 0) {
outputStream.write(bytes, offset, total - offset);
}
outputStream.close();
}
byte 배열을 offset부터 len만큼 write 합니다.
파일 읽어와서 출력
public void read() throws IOException {
File file = new File("D://write_test.txt");
InputStream inputStream = new FileInputStream(file);
int b;
while ((b = inputStream.read()) != -1) {
System.out.print(b);
}
}
write_test.txt로 write 한 데이터를 한 바이트씩 꺼내서 출력합니다.
public void flush() throws IOException {}
버퍼를 지원하는 경우 버퍼에 존재하는 데이터를 목적지까지 보냅니다.
public void close() throws IOException { }
OutputStream을 종료합니다.
참조 :
https://bamdule.tistory.com/179