이들은 메모리, 즉 바이트배열에 데이터를 입출력 하는데 사용되는 스트림이다.
주로 다른 곳에 입출력하기 전에 데이터를 임시로 바이트 배열에 담아서 변환 등의 작업을 할때 사용한다.
예제를 보자.
import java.io.*;
import java.util.Arrays;
public class EX15_1 {
public static void main(String[] args) {
byte[] inSrc = {0,1,2,3,4,5,6,7,8,9}; //input을 위한 배열(버퍼역할)
byte[] outSrc = null;
ByteArrayInputStream input = null;
ByteArrayOutputStream output = null;
input = new ByteArrayInputStream(inSrc);
output = new ByteArrayOutputStream(); //인자로 int형 size을 받을 수 있다
int data = 0;
while((data = input.read()) != 1) {
output.write(data); //void write(int b)사용
}
outSrc = output.toByteArray(); //스트림의 내용을 byte배열로 반환, ByteArrayOutputStream클래스 소속
System.out.println("Input Source : "+ Arrays.toString(inSrc));
System.out.println("Output Source : "+ Arrays.toString(outSrc));
}
}
위 예제는 ByteArrayInput, Output Stream을 이용해 바이트배열 inSrc에 있는 내용을 outSrc로 복사하는 예제이다.
ByteArrayInputStream(inSrc);
에서 인자전달되는 inSrc는 read할때 버퍼처럼 이용되는 바이트 배열을 해당한다. 여기서는 복사의 소스역할도 한다.
.read()로 인풋스트림의 내용을 읽어, int형 변수 data에 저장하고, 이후 .write()로 data에 저장된 값들을 읽어 아웃풋 스트림으로 읽어들인다.
마지막으로 아웃풋 스트림의 내용을 Byte배열로 만들어 outSrc에 저장한다.
코드 흐름이 한눈에 들어오지 않아서 그림을 그려봤다.
위의 예제는 read()와 writhe(int b)가 한번에 1byte씩만 작업하므로 효율이 떨어진다. 배열을 이용하면 입출력 작업의 효율을 높일 수 있다.
byte[] inSrc = {0,1,2,3,4,5,6,7,8,9}; //input을 위한 배열(버퍼역할)
byte[] outSrc = null;
byte[] temp = new byte[10]; //입출력 작업 효율을 높이기 위한 배열
ByteArrayInputStream input = new ByteArrayInputStream(inSrc);
ByteArrayOutputStream output = new ByteArrayOutputStream(); //인자로 int형 size를 받음
input.read(temp,0,temp.length); //주어진 byte배열로부터 인덱스 0부터 배열길이 만큼 읽어 temp에 저장한다.
output.write(temp,5,5); //temp[5]부터 5개의 데이터를 write한다.
outSrc = output.toByteArray(); //스트림의 내용을 byte배열로 반환, ByteArrayOutputStream클래스 소속
System.out.println("Input Source : "+ Arrays.toString(inSrc));
System.out.println("temp : "+ Arrays.toString(temp));
System.out.println("Output Source : "+ Arrays.toString(outSrc));