판봉 개발 일기

바이트 입력 스트림 : InputStream 본문

자바 복습

바이트 입력 스트림 : InputStream

판봉 2021. 7. 14. 13:44
728x90

모든 바이트 기반 입력 스트림은 "InputStream"을 상속받아서 만들어 집니다.

다음은 InputStream 클래스의 주요 메소드를 표로 나타낸 것입니다.

리턴 타입 메소드 설명
int read() 1byte를 읽고 읽은 바이트를 리턴
int read(byte[] b) 읽은 바이트를 매개값으로 주어진 배열에 저장하고 읽은 바이트 수를 리턴
int read(byte[] b, int off, int len) len개의 바이트를 읽고 매개값으로 주어진 배열에서 b[off]부터 len개 까지 저장
그리고 읽은 바이트 수를 리턴
void close() 입력 스트림을 닫습니다.

read() 메소드는 입력 스트림으로부터 1byte를 읽고 int(4byte) 타입으로 리턴합니다.

따라서 리턴된 4byte중 끝 1byte만 데이터가 들어 있습니다.

※4byte는 맞지만 1byte만 데이터가 들어있는 것임을 유의하자!

 

그리고 만약에 입력 스트림으로 부터 바이트를 읽을 수 없는 경우엔 read() 메소드는 -1을 리턴합니다.

이것을 이용하면 읽을 수 있는 마지막 바이트까지 반복해서 1byte씩 읽을 수 있습니다.

다음은 그와 관련된 코드입니다.

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

public class ReadExmple {
	public static void main(String[] args) throws Exception {
    InputStream is = new FileInputStream("C:/Temp/test1.db");
    while(true) {//항상 실행
    int data = is.read(); // 1byte씩 읽고 바이트를 리턴
    if(data == -1) break; // 더이상 읽을 바이트가 존재하지 않는다면 이라는 뜻
    System.out.println(data);
    }
    is.close(); //입력 스트림을 닫음
    }
}

 

※InputStream은 OutputStream과 다르게 주요 메소드중에서 flush()가 존재하지 않음을 유의하자.


read(byte[] b) 메소드는  입력 스트림으로부터 매개값으로 주어진 배열의 길이만큼 바이트를 읽고 해당 배열에 저장합니다.

그리고 읽은 바이트 수를 리턴합니다.

 

또한, 더이상 바이트를 읽을 수 없는 경우엔 read() 메소드와 같이 -1을 리턴합니다.

 

다음은 그를 활용한 코드입니다.

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

public class ReadExmple {
	public static void main(String[] args) throws Exception {
    	InputStream is = new FileInputStream("C:/Temp/test2.db");
        
        byte[] buffer = new byte[100]; // 길이가 100인 배열을 생성
        
        while(ture) {
        int readByteNum = is.read(buffer); // 배열의 길이만큼 읽기
        if(readByteNum == -1) break;
        for(int i = 0; i<readByteNum; i++) {
        	System.out.println(buffer[i]); // 읽은 바이트 수만큼 반복하면서 바이트 출력
        }
        }
        
        is.close(); // 입력 스트림을 닫음
    }
}

꿀팁으로는 많은 양의 바이트를 읽을 때는 read(byte[] b) 메소드를 사용하는 것이 좋다.


read(byte[] b, int off, int len)메소드는 입력 스트림으로부터 len개의 바이트를 읽고 매개값으로 주어진 바이트 배열 b[off]부터 len개 까지 저장합니다. 그리고 읽은 바이트 수인 len개를 리턴합니다.

 

또한 더이상 바이트를 읽을 수 없다면 위의 것들과 마찬가지로 -1을 리턴합니다.

 

read(byte[] b) 메소드와의 차이점은 바이트 수를 len 매개값으로 조절할 수 있으며, 배열에서 저장이 시작되는

인덱스를 직접 지정할 수 있다는 것입니다.

만약 off를 0으로 len을 배열의 길이로 준다면 read(byte[] b) 메소드와 동일하다고 볼 수 있습니다.

InputStream is = ...;
byte[] readBytes = new byte[100];
int readByteNo = is.read(readBytes);

아래와 위는 동일한 기능을 한다고 볼수 있습니다.

InputStream is = ...;
byte[] readBytes = new byte[100];
int readByteNo = is.read(readBytes, 0, 100);

다음 코드는 read(byte[] b, int off, int len) 메소드를 사용한 코드입니다.

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

public class ReadExmple {
	public static void main(String[] args) throws Exception {
    	InpurtStream is = new FileInputStream("C:/Temp/test3.db");
        
        byte[] buffer = new byte[5];
        
        int readByteNum = is.read(buffer, 2, 3); //입력 스트림으로 부터 3byte를 읽고 buffer[2].
        //buffer[3], buffer[4]에 각각 저장
        if(readByteNum != -1) { //읽을 바이트가 있다면
      		  for(int i = 0; i<buffer.length; i++) {
              System.out.println(buffer[i]);
              }
        }
        
        is.close();
    }
}

판봉의 한줄평

바이트기반의 입력 스트림에는 flush()메소드는 존재하지 않으며 또한 더이상 읽을 바이트가 없다면 -1을 리턴하는 공통점을 가지고 있다는 점을 알 수있다.

'자바 복습' 카테고리의 다른 글

문자 입력 스트림 Reader  (0) 2021.07.15
문자 출력 스트림 : Writer  (0) 2021.07.14
바이트 출력 스트림 : OutputStream  (0) 2021.07.14
입출력 스트림  (3) 2021.07.14
FIFO 컬렉션과 Queue 인터페이스  (2) 2021.07.14