자바 IO 흐름 의 ByteArray InputStream 분석
ByteArray InputStream 은 바이트 배열 의 입력 흐름 입 니 다.메모리 에 바이트 배열 을 만 들 었 습 니 다.입력 흐름 에서 읽 은 데 이 터 를 바이트 배열 의 캐 시 영역 에 저장 합 니 다.즉,바이트 배열 의 입력 흐름 은 읽 은 데 이 터 를 바이트 배열 버퍼 에 저장 합 니 다.
1.ByteArray InputStream 구조 방법 은 두 가지 가 있 습 니 다.
public ByteArrayInputStream(byte buf[]) {}
public ByteArrayInputStream(byte buf[], int offset, int length) {}
protected byte buf[];
protected int pos;
protected int mark = 0;
protected int count;
public synchronized int read()
public synchronized int read(byte b[], int off, int len) {}
public synchronized long skip(long n) {}
public synchronized int available() {}
public boolean markSupported() {}
public void mark(int readAheadLimit) {}
public synchronized void reset() {}
public void close() throws IOException{}
케이스
public class ByteArrayInputStreamDemo {
public static void main(String[] args) {
byte[] bytes = "abcdefghijklmnopqrst".getBytes();
ByteArrayInputStream byteStream = new ByteArrayInputStream(bytes);
//avaiable , a, 19
if(byteStream.available()>0) {
System.out.println((char)byteStream.read()+"------ ="+byteStream.available());
}
for(int i = 0 ; i < 3;i++) {
if(byteStream.available()>0) {
System.out.println((char)byteStream.read());
}
}
// d, 3 , h
long skip = byteStream.skip(3);
System.out.println((char)byteStream.read()+"----- ="+skip);
if(byteStream.markSupported()) {
System.out.println("support mark");
}
// i, .
byteStream.mark(0);
// , .
byte[] byteArray = new byte[3];
byteStream.read(byteArray, 0, 2);
System.out.println(new String(byteArray));
// reset() mark
byteStream.reset();
System.out.println((char)byteStream.read());
}
실행 결과:
a------ =19
b
c
d
h----- =3
support mark
ij
코드 분석:
(a)read()방법 은 한 바이트 만 읽 을 수 있 고 다음 바이트 만 읽 을 수 있 습 니 다.
(b)read(buf,offset,len)방법 으로 바이트 배열 buf 를 만 들 고 스 트림 의 데 이 터 를 buf 에 읽 습 니 다.위 치 는 offset 부터 시작 합 니 다.길 이 는 len 입 니 다.
(c)available()는 읽 을 수 있 는 바이트 수 를 표시 합 니 다.코드 에서 a 를 읽 었 을 때 읽 을 수 있 는 바이트 수 는 19 바이트 가 남 았 습 니 다.
(d)mark()는 다음 바이트 의 위 치 를 표시 합 니 다.뒤의 몇 바이트 까지 읽 은 후에 reset()를 사용 하여 이 위치 로 다시 돌아 갈 수 있 습 니 다.
(e)skip(n):건 너 뛰 는 바이트 수 를 표시 합 니 다.다음 바이트 부터 계산 합 니 다.코드 에 서 는 e 가 계산 하기 시 작 했 습 니 다.3 개의 바 이 트 를 건 너 뛰 고 g 가 끝 날 때 까지 입 니 다.다음 읽 는 바 이 트 는 h 입 니 다.
소스 코드 분석
public class ByteArrayInputStream extends InputStream {
//
protected byte buf[];
//
protected int pos;
//
protected int mark = 0;
//
protected int count;
// -- buf
public ByteArrayInputStream(byte buf[]) {
this.buf = buf;
// 0
this.pos = 0;
// ,count buf.length
this.count = buf.length;
}
// -- , buf , offset , length .
public ByteArrayInputStream(byte buf[], int offset, int length) {
this.buf = buf;
this.pos = offset;
// ,count offset+length,buf.length
this.count = Math.min(offset + length, buf.length);
// , offset
this.mark = offset;
}
//
public synchronized int read() {
return (pos < count) ? (buf[pos++] & 0xff) : -1;
}
// b ,off ,len
public synchronized int read(byte b[], int off, int len) {
if (b == null) {
throw new NullPointerException();
} else if (off < 0 || len < 0 || len > b.length - off) {
throw new IndexOutOfBoundsException();
}
// count,
if (pos >= count) {
return -1;
}
// len ,len
int avail = count - pos;
if (len > avail) {
len = avail;
}
if (len <= 0) {
return 0;
}
System.arraycopy(buf, pos, b, off, len);
pos += len;
return len;
}
// , .
public synchronized long skip(long n) {
// count- pos
long k = count - pos;
// k , 0, 0, n
if (n < k) {
k = n < 0 ? 0 : n;
}
// pos .
pos += k;
return k;
}
// , count- pos
public synchronized int available() {
return count - pos;
}
// , true
public boolean markSupported() {
return true;
}
// 。readAheadLimit
public void mark(int readAheadLimit) {
mark = pos;
}
// mark()
public synchronized void reset() {
pos = mark;
}
// ,
public void close() throws IOException {}
}
원본 코드 요약:
(a)count 실제 상류 내용 은 바이트 배열 에서 사용 할 수 있 는 색인 값+1 입 니 다.읽 을 때 다음 읽 을 색인 pos 와 count 를 비교 합 니 다.count 보다 작 을 때 스 트림 바이트 데이터 에 이 색인 이 존재 하기 때문에 스 트림 내용 을 읽 을 수 있 습 니 다.
(b)스 트림 에 있 는 데이터 나 내용 은 구조 함수 에 있 는 buf 바이트 배열 과 offset 과 읽 기 길이 len 을 봐 야 합 니 다.아래 read(by te[]b,int off,int len)는 스 트림 에 있 는 내용 을 바이트 배열 에 읽 는 것 을 의미 합 니 다.두 가 지 는 구분 에 주의해 야 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.