판봉 개발 일기
바이트 입력 스트림 : InputStream 본문
모든 바이트 기반 입력 스트림은 "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 |