5-1.(4) 바이트 기반 스트림

zhyun·2020년 9월 26일
0

HighJava

목록 보기
39/67

1. 스트림(Stream)

  • 일차원적인 데이터흐름을 의미
  • 데이터를 목적지로 입출력 하기 위한 방법
  • 자바의 스트림객체를 이용하여 스트림 형식으로 데이터를 읽고쓰기 가능
  • 스트림 형식으로 데이터를 읽기 위해 입력스트림(InputStream) 사용
  • 스트림 형식으로 데이터를 쓰기 위해 출력스트림(OutputStream) 사용

2. 바이트기반스트림

(1) 바이트 기반 스트림

  • 바이트 기반 스트림은 1byte를 입출력 할 수 있는 스트림
  • 일반적으로 바이트로 구성된 파일(동영상, 이미지, 음악)을
    처리하기에 적합한 스트림
  • InputStream은 입력용, OutputStream은 출력용
  • 'InputStream'이나 'OutputStream'이라는 단어가 붙으면 바이트 스트림

(2) 바이트 기반 스트림 종류

InputStream

  • Buffered~
    • 라인단위 읽기가능
  • LineNumber~
    • 라인번호를 유지
  • ByteArray~
    • 문자배열로부터 문자 읽기
  • File~
    • 파일로부터 바이트 읽을 때 문자 단위 스트림으로 처리
  • Filter~
    • 필터(기능) 적용을 위한 추상클래스
  • Pushback~
    • 읽어들인 문자를 되돌리는 기능 제공
  • Piped~
    • 파이프 기능을 이용한 스트림 처리를 위한 기능 제공
  • StringBuffer~
    • 문자열로부터 문자를 읽기 위한 스트림

메서드

  • read()
    • byte단위로 읽어와 int형으로 반환
    • 더이상 읽어올 자료가 없으면 -1 반환
    • ex) 10byte면 10번 읽고 3byte면 3번 읽고..

OutputStream

  • Buffered~
    • Writer스트림에 버퍼기능 제공하는 보조 스트림
  • ByteArray~
    • 문자배열에 문자를 쓰기 위한 스트림
  • Filter~
    • 파일에 문자 단위 스트림 쓰는 기능 제공
  • File~
    • 파일에 데이터쓸 때 문자 단위 스트림으로 처리
  • PringStream
    • Writer스트림에 다양한 데이터 출력 기능 제공하는 보조스트림
  • Piped~
    • PipedReader에 출력기능 제공

메서드

  • write(int data)
    • baos에 바이트 정보 넣어줌
  • toByteArray()
    • 출력된 스트림 값들을 byte 배열로 변환해서 반환하는 메서드

예시1

ByteArray ~ : byte단위로 작업

T03_ByteArrayIOTest
main() throws IOException

	byte[] inSrc = {0,1,2,3,4,5,6,7,8,9};
	byte[] outSrc = null;

	//스트링 선언 및 객체 생성
	ByteArrayInputStream bais = null;//스트림객체 선언
	bais = new ByteArrayInputStream(inSrc); //객체 생성
        
      	ByteArrayOutputStream baos = new ByteArrayOutputStream();
        
        int data;//읽어온 자료를 저장할 변수
		
        while((data=bais.read())!=-1) {//-1이 아닐때까지 읽어
		baos.write(data);//출력하기 : OutputStream 객체 baos한테 맡겨
	}
		
        //출력된 스트림 값들을 배열로 변환해서 반환하는 메서드
	outSrc = baos.toByteArray();
        
        System.out.println("inSrc => "+Arrays.toString(inSrc));
	System.out.println("outSrc => "+Arrays.toString(outSrc));
        
        //스트림 객체 닫아주기 (IOExeption 던져줘 빨간거 뜨니까)
	bais.close(); 
	baos.close();

Console:
inSrc => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
outSrc => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

예시2

ByteArray~ : 4byte씩

  • T04_ByteArrayIOTest
  • 임시 저장공간 역할 'temp' 이용해서 ByteArrayIO작업
    => 효율 증가
    => 한번에 4byte씩 IO
public class T04_ByteArrayIOTest {
	public static void main(String[] args) {
		//1>>
		byte[] inSrc = {0,1,2,3,4,5,6,7,8,9};
		byte[] outSrc = null;
		
		//2>> 4byte가진 배열 생성했으니까 read()에 temp를 담아서 읽으면 4개씩 읽는다.
		byte[] temp = new byte[4]; //자료읽을때 사용할 배열
		
		ByteArrayInputStream bais = new ByteArrayInputStream(inSrc);
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		
		//3>> available(), read(), write()
		try {
			//available() => 읽어 올 수 있는 byte수를 반환
//			while(bais.available() > 0) {//읽어들일 수 있으면 3바퀴 돈다.
			int len; //실제 읽어온 byte 수를 반환한다.
     		while((len = bais.read(temp)) != -1) {
				
				/*bais.read(temp); //temp배열 크기만큼 자료를 읽어와 temp배열에 저장한다.
				baos.write(temp);//temp배열의 내용을 출력한다.
				*/
				
				//실제 읽어온 byte수를 반환한다. read()와 read(temp)차이
				//int len = bais.read(temp); // byte개수 반환, 더이상 읽어올게 없으면 -1반환
				
				//temp배열의 내용 중에서 0번째 부터 len 개수만큼 출력
				baos.write(temp, 0, len);//(temp, 어디서부터 읽을건지, len)
				
				System.out.println("temp : "+Arrays.toString(temp));
			}
			outSrc = baos.toByteArray();
			
			System.out.println("inSrc => "+Arrays.toString(inSrc));
			System.out.println("outSrc => "+Arrays.toString(outSrc));
			
			//스트림 객체 닫아주기
			bais.close();
			baos.close();
			
		}catch(IOException ex){
			ex.printStackTrace();
		}
	}
}

Console:
temp : [0, 1, 2, 3]
temp : [4, 5, 6, 7]
temp : [8, 9, 6, 7]
inSrc => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
outSrc => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

profile
HI :)

0개의 댓글