이전 기사 옆에서 우리는 Java에서 계속해서 BYTE 스트림 작업을 학습 할 것입니다.
데코레이터 버퍼링 스트림 bufferedInput/outputStream
데코레이터 스트림은 실제로 디자인 패턴 "데코레이터 모드"를 기반으로 한 파일 IO 스트림이며 버퍼 스트림은 그 중 하나 일뿐입니다. 봅시다.
그 전에는 파일 읽기 및 쓰기 스트림을 사용하여 FileInputStream 및 FileOutputStream을 사용하여 Disk Byte 또는 Byte에서 읽기 및 쓰기가 매우 시간이 많이 걸렸습니다.
버퍼 스트림은 디스크에서 지정된 용량의 바이트 수를 한 번에 메모리로 미리 읽을 수 있으며, 후속 읽기 작업은 메모리에서 직접 읽어 효율성을 향상시킵니다. 버퍼링 된 스트림의 특정 구현을 살펴 보겠습니다.
BufferedInputStream을 먼저 예로 들어 봅시다. 핵심 속성을 간단히 언급하겠습니다.
BUF는 버퍼링 읽기에 사용되는 바이트 어레이입니다. 스트림이 읽히면 값이 지속적으로 채워지고 후속 읽기 작업은이 버퍼링 된 어레이를 기반으로 직접적으로 이루어질 수 있습니다.
default_buffer_size 기본 버퍼의 크기, 즉 BUF의 배열 길이를 지정합니다. max_buffer_size 버퍼의 상한을 지정합니다.
카운트는 버퍼링 된 어레이에서 마지막으로 유효한 바이트 색인을 가리 킵니다. POS는 다음 바이트 색인 위치를 가리 킵니다.
Markpos와 Marklimit은 읽기 작업을 반복하는 데 사용됩니다.
다음으로 BufferedInputStream의 몇 가지 예제 생성자를 살펴 보겠습니다.
public bufferedInputStream (inputStream in) {this (in, default_buffer_size);} public bufferedInputStream (inputStream in, int size) {super (in); if (size <= 0) {새로운 불법 불법 행정 렉싱 ( "버퍼 크기 <= 0"); } buf = 새로운 바이트 [size];}전반적으로 전자는 "장식"인 입력 스트림 인스턴스 만 전달하고 기본 크기의 버퍼를 사용하면됩니다. 후자는 버퍼의 크기를 명시 적으로 나타낼 수 있습니다.
또한 Super (in)는이 inputStream 인스턴스를 부모 클래스 FilterInputStream의 IN 속성 필드에 저장하며 모든 실제 디스크 읽기 작업은이 inputStream 인스턴스에 의해 발행됩니다.
가장 중요한 읽기 작업과 버퍼가 채워진 방법을 살펴 보겠습니다.
public synchronized int read ()는 ioexception {if (pos> = count) {fill (); if (pos> = count) return -1; } return getBufifoPen () [pos ++] & 0xff;}나는 모든 사람들이 이미이 방법에 익숙하다고 생각합니다. 스트림에서 다음 바이트를 읽고 반환하지만 세부 사항의 구현은 여전히 약간 다릅니다.
카운트는 버퍼링 된 어레이에서 유효한 바이트 인덱스의 다음 위치를 가리 킵니다. POS는 읽기 할 바이트 색인의 다음 위치를 가리 킵니다. 이론적으로 POS는 최대 동등한 수보다 클 수 없습니다.
POS가 카운트와 같으면 버퍼 배열의 모든 유효한 바이트가 읽혔다는 것을 의미합니다. 현재 버퍼의 "쓸모없는"데이터를 폐기해야하며 버퍼를 채우기 위해 디스크에서 새 데이터 배치가 다시로드됩니다.
실제로, 채우기 방법은 그것이하는 일입니다. 코드가 많으므로 구문 분석하지 않겠습니다. 그 기능을 이해하면 구현을 쉽게 분석 할 수 있습니다.
POS가 채우기 메소드가 호출 된 후에도 여전히 카운트와 같으면 입력 스트림 인스턴스가 스트림에서 데이터를 읽지 않았으며, 즉, 파일 스트림에 읽을 데이터가 없음을 의미합니다. 이를 위해 Fill Method의 246 행을 참조하십시오.
일반적으로 버퍼가 성공적으로 채워지면 읽기 메소드는 버퍼에서 바이트를 직접 가져 와서 발신자에게 반환합니다.
public synchronized int read (byte b [], int off, int len) {// .....}이 방법은 또한 "지인"이며 더 이상 불필요한 설명이 없으며 구현이 비슷합니다.
건너 뛰기 방법은 파일 스트림을 계속 읽기 위해 지정된 길이의 바이트 수를 건너 뛰는 데 사용됩니다.
public synchronized long skip (long n) {// ......}주목할만한 점은 Skip Method가 N 바이트를 건너 뛰려고하지만 N 바이트를 건너 뛰는 것은 보장되지 않습니다. 이 메소드는 건너 뛰는 실제 바이트 수를 반환합니다. 버퍼링 된 어레이의 나머지 수의 사용 가능한 바이트 수가 N보다 적은 경우, 버퍼링 된 배열에서 건너 뛸 수있는 실제 바이트 수가 결국 건너 뜁니다.
마지막 으로이 가까운 방법에 대해 이야기 해 봅시다.
public void close ()는 ioexception {byte [] 버퍼; while ((buffer = buf)! = null) {if (bufupdater.compareAndset (this, buffer, null)) {inputstream input = in; in = null; if (input! = null) input.close (); 반품; } // 새로운 buf가 fill ()}에 케이스 된 경우 else retry}}가까운 방법은 "장식 된"스트림을 비우고 밀접한 방법을 호출하여 관련 리소스를 릴리스하여 결국 버퍼 배열에서 차지하는 메모리 공간을 지울 수 있습니다.
BufferedInputStream은 읽기 버퍼링 기능을 제공하지만 BufferedOutputStream은 쓰기 버퍼링 기능을 제공합니다.
보호 된 바이트 buf []; 보호 된 int 수;
BUF는 내부 버퍼를 나타내고, 카운트는 버퍼의 실제 데이터 용량, 즉 BUF 배열의 길이가 아닌 BUF의 유효 바이트 수를 나타냅니다.
public bufferedoutputStream (outputStream out) {this (out, 8192);} public bufferedOutputStream (outputStream out, int size) {super (out); if (size <= 0) {새로운 불법 불법 행정 렉싱 ( "버퍼 크기 <= 0"); } buf = 새로운 바이트 [size];}동일한 구현 아이디어를 사용하면 출력 스트림 출력 스트림 인스턴스를 제공해야하며 버퍼 크기도 선택적으로 지정할 수 있습니다.
public synchronized void Writ } buf [count ++] = (byte) b;}
쓰기 메소드는 먼저 버퍼 가이 쓰기 작업을 수용 할 수 있는지 여부를 확인합니다. 디스크 쓰기 작업을 시작할 수없는 경우 모든 버퍼 데이터가 디스크 파일에 기록됩니다. 그렇지 않으면 버퍼가 먼저 버퍼에 기록됩니다.
물론 BufferedOutputStream은 외부에 대한 인터페이스를 제공하는 플러시 메소드를 제공합니다. 즉, 디스크에 데이터를 작성하기 전에 버퍼가 가득 차있을 때까지 기다릴 필요가 없습니다. 이 메소드를 명시 적으로 호출하여 버퍼를 지우고 디스크 파일을 업데이트 할 수 있습니다.
public synchronized void flush ()는 ioexception {flushbuffer (); out.flush ();}버퍼링 된 스트림과 관련하여 코어 컨텐츠는 위와 같이 도입됩니다. 이것은 효율성을 크게 향상시킬 수있는 스트림입니다. 이를 통해 디스크 액세스의 수를 줄이고 프로그램 실행 효율을 향상시킬 수 있습니다.
기본 유형을 기반으로 객체 직렬화 스트림 대상/outputStream 및 Decorator Stream Datainput/OutputStream에 대해서는 논의하지 않습니다. 직렬화를 배울 때이 두 바이트 스트림에 대해 다시 논의 할 것입니다.
기사의 모든 코드, 이미지 및 파일은 내 github의 클라우드에 저장됩니다.
(https://github.com/singleyam/overview_java)
로컬로 다운로드하도록 선택할 수도 있습니다.
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.