본문 바로가기
  • Coding & Book
학습단/JAVA 학습단

21. 혼공자 21일차(입출력 스트림)

by 루이3 2023. 8. 14.

입출력 스트림의 종류

  • java.io 패키지에는 여러 가지 종류의 스트림 클래스를 제공하고 있습니다.
  • 스트림 클래스는 크게 바이트 기반 스트림, 문자 기반 스트림으로 구분됩니다.
  • 바이트 기반 스트림은 그림, 멀티미디어 등의 바이너리 데이터를 읽고 출력할 때 사용합니다.
  • 문자 기반 스트림은 문자 데이터를 읽고 출력할때 사용합니다.

 

구분 바이트 기반 스트림 문자 기반 스트림
입력 스트림 출력 스트림 입력 스트림 출력 스트림
최상위 클래스 InputStream OutputStream Reader Writer
하위 클래스 XXXInputStream XXXOutputStream XXXReader XXXWriter

 

 

바이트 출력 스트림

  • OutputStream은 바이트 기반 출력 스트림의 최상위 클래스로 추상 클래스입니다.
  • 모든 바이트 기반 출력 스트림 클래스는 OutputStream 클래스를 상속받아서 만들어집니다.
  • 아래는 주요 메소드들입니다.
리턴 타입 메소드 설명
void write(int b) 1byte를 출력합니다
void write(byte[] b) 매개값으로 주어진 배열 b의 모든 바이트를 출력합니다.
void write(byte[] b,int off, int len) 매개값으로 주어진 배열 b[off]부터 len개까지의 바이트를 출력합니다.
void flush() 출력 버퍼에 잔류하는 모든 바이트를 출력합니다.
void close() 출력 스트림을 닫습니다.

 

 

write(int b)메소드

  • 매개변수로 주어지는 int(4byte)에서 끝 1byte만 출력 스트림으로 보냅니다.

 

코드 설명)

  • 11,22,33이 저장된 각각의 바이트를 출력해서 testresult.db의 내용으로 저장하는 것입니다.
  • FileOutputStream은 자식 클래스이므로 자동 변환됩니다.
  • flush 메소드는 이 내부 버퍼에 잔류된 바이트를 모두 출력합니다.
  • OutputStream을 더 이상 사용하지 않겠다는 의미로 os.close를 사용합니다.
package sec18.exam01;

import java.io.FileOutputStream;
import java.io.OutputStream;


public class WriteExample {

	public static void main(String[] args) throws Exception {
		OutputStream os = new FileOutputStream("저장위치/testresult.db");
		
		byte a = 11;
		byte b = 22;
		byte c = 33;
		
		os.write(a);
		os.write(b);
		os.write(c);
		
		os.flush();
		os.close();
	}
}

저장된 내용

 

write(byte [] b) 메소드 와 write(byte[] b,int off, int len) 메소드

  • write(byte[] b) 메소드는 매개값으로 주어진 배열의 모든 바이트를 출력 스트림으로 보냅니다.
  • write(byte[] b,int off, int len) 메소드는 b[off]부터 len개의 바이트 출력 스트림으로 보냅니다.
package sec18.exam01;

import java.io.FileOutputStream;
import java.io.OutputStream;


public class WriteExample {

	public static void main(String[] args) throws Exception {
		OutputStream os = new FileOutputStream("저장위치/testresult2.db");
		
		byte[] array = {11,22,33};

		//배열의 모든 바이트 출력
		os.write(array);
        
        // 배열의 1번 인덱스부터 3개 출력
        // os.write(array, 1, 3)
		
		os.flush();
		os.close();
	}
}

 

 

바이트 입력 스트림

  • InputStream은 바이트 기반 입력 스트림의 최상위 클래스로 추상 클래스입니다.
  • 모든 바이트 기반 입력스트림은 InputStream 클래스를 상속받아서 만들어집니다.
  • 아래는 주요 메소드들입니다.
리턴 타입 메소드 설명
int read() 1byte를 읽고 읽은 바이트를 리턴합니다.
int read(byte[] b) 읽은 바이트를 매개값으로 주어진 배열에 저장하고 읽은 바이트수를 리턴합니다.
int read(byte[]b, int off, int len) len개의 바이트를 읽고 매개값으로 주어진 배열에서 b[off]부터 len개까지 저장합니다.
void close() 입력 스트림을 닫습니다.

 

read() 메소드

  • read() 메소드는 입력 스트림으로 부터 1byte를 읽고 int(4byte) 타입으로 리턴합니다.
  • 리턴된 3byte 중 끝 1byte에만 데이터가 들어갑니다.
package sec18.exam01;

import java.io.FileInputStream;
import java.io.InputStream;

public class ReadExample {
	public static void main(String[] args) throws Exception {
		InputStream is = new FileInputStream("저장위치/testresult2.db");
		while(true) {
			//1byte씩 읽기
			int data = is.read();
			
			//파일 끝에 도달했을 경우
			if(data == -1) break;
            
			System.out.println(data);
		}
		is.close();
	}
}

 

 

read(byte[]b, int off, int len) 메소드

  • read(byte[]b, int off, int len) 메소드는 입력 스트림으로부터 len개의 바이트만큼 읽고
    매개값으로 주어진 바이트 배열 b[off]부터 len개 까지 저장합니다
  • 실제로 읽은 바이트 수가 len개보다 작을 경우에는 읽은 수만큼 리턴합니다.
  • read(byte[] b)와 차이점은 한 번에 읽어드리는 바이트 수를 len 매개값으로 조절할 수 있으며 배열에서
     저장이 시작되는 인덱스를 지정할 수 있다는 점입니다.
package sec18.exam01;

import java.io.FileInputStream;
import java.io.InputStream;


public class ReadExample3 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		InputStream is = new FileInputStream("저장 위치/testresult2.db");

		byte[] buffer = new byte[5];
		
		int readByteNum = is.read(buffer, 2, 3);
		if(readByteNum != -1) {
			for(int i=0; i<buffer.length; i++) {
				System.out.println(buffer[i]);
			}
		}
		
		is.close();
	}
}