자바 IO 흐름 상용 바이트 문자 흐름 원리 분석

자바 의 흐름 체 계 는 매우 방대 하 다.우 리 는 체계 도 를 살 펴 보 자.

이렇게 방대 한 체계 안에서 자주 사용 하 는 것 은 바로 그 몇 개 이다.우 리 는 그것들 을 뽑 아 냈 다.다음 과 같다.

바이트 흐름
1:바이트 입력 흐름
바이트 입력 흐름 의 추상 적 인 기본 클래스 는 InputStream 이 고 자주 사용 하 는 하위 클래스 는 FileInputStream 과 Buffered InputStream 입 니 다.
1)FileInputStream
파일 바이트 입력 흐름:모든 파일 은 시스템 에 바이트 형식 으로 저 장 됩 니 다.문서 파일,비디오 파일,오디 오 파일 이 든...이 파일 을 읽 어야 합 니 다.저장 매체(디스크 등)에 저 장 된 바이트 시퀀스 를 FileInputStream 으로 읽 을 수 있 습 니 다.
FileInputStream 은 생 성 할 때 파일 이름 을 구조 적 매개 변수 로 이 파일 의 바이트 내용 에 연결 하여 바이트 흐름 전송 채널 을 만 듭 니 다.
그리고 read(),read(byte[]),read(byte[],int begin,int len)세 가지 방법 으로 바이트 흐름 에서 바이트 하나,바이트 한 그룹 을 읽 습 니 다.
2)BufferedInputStream
버퍼 가 있 는 바이트 입력 흐름:위 에서 파일 바이트 입력 흐름 을 읽 을 때 바이트 흐름 과 직접 읽 습 니 다.바이트 흐름 은 하드웨어(저장 매체)와 읽 기 때문에 속도 가 느 립 니 다.CPU 가 데 이 터 를 사용 해 야 할 때 read(),read(by te[])를 통 해 데 이 터 를 읽 을 때 하드웨어 IO 의 느 린 속도 제한 을 받 아야 합 니 다.CPU 와 메모리 에서 발생 하 는 읽 기와 쓰기 속도 가 하드웨어 IO 보다 10 배 이상 빠 르 기 때문에 읽 기와 쓰 기 를 최적화 하 는 사고방식 이 생 겼 다.메모리 에 캐 시 구역 을 만 들 고 저장 매체 에 있 는 바이트 를 캐 시 구역 으로 읽 는 것 이다.CPU 가 데 이 터 를 필요 로 할 때 버퍼 에서 직접 읽 으 면 됩 니 다.버퍼 는 충분 해 야 합 니 다.읽 힌 후에 fill()함수 가 미디어 를 저장 하 는 파일 바이트 내용 에서 자동 으로 바이트 를 읽 어 버퍼 배열 로 저장 합 니 다.
BufferedInputStream 내부 에 버퍼 가 있 습 니 다.기본 크기 는 8M 입 니 다.read 방법 을 호출 할 때마다 버퍼 에서 데 이 터 를 읽 으 려 고 시도 합 니 다.읽 기 에 실패 하면 물리 적 데이터 원본(예 를 들 어 파일)에서 새 데 이 터 를 읽 는 것 을 선택 하 십시오.마지막 으로 버퍼 의 내용 을 사용자 에 게 되 돌려 줍 니 다.버퍼 에서 데 이 터 를 읽 는 것 이 저장 매체 에서 직접 읽 는 것 보다 훨씬 빠 르 기 때문에 BufferedInputStream 의 효율 이 높 습 니 다.

public class OutputStreamWriter extends Writer {
	//     ,          。
	private final StreamEncoder se;
	//          OutputStreamWriter。
	public OutputStreamWriter(OutputStream out, String charsetName)
	      throws UnsupportedEncodingException
	 {
		super(out);
		if (charsetName == null)
		      throw new NullPointerException("charsetName");
		se = StreamEncoder.forOutputStreamWriter(out, this, charsetName);
	}
	//          OutputStreamWriter。
	public OutputStreamWriter(OutputStream out) {
		super(out);
		try {
			se = StreamEncoder.forOutputStreamWriter(out, this, (String)null);
		}
		catch (UnsupportedEncodingException e) {
			throw new Error(e);
		}
	}
	//           OutputStreamWriter。
	public OutputStreamWriter(OutputStream out, Charset cs) {
		super(out);
		if (cs == null)
		      throw new NullPointerException("charset");
		se = StreamEncoder.forOutputStreamWriter(out, this, cs);
	}
	//              OutputStreamWriter。
	public OutputStreamWriter(OutputStream out, CharsetEncoder enc) {
		super(out);
		if (enc == null)
		      throw new NullPointerException("charset encoder");
		se = StreamEncoder.forOutputStreamWriter(out, this, enc);
	}
	//             。       ,         null。
	public String getEncoding() {
		return se.getEncoding();
	}
	//              ,         。      PrintStream  。
	void flushBuffer() throws IOException {
		se.flushBuffer();
	}
	//       
	public void write(int c) throws IOException {
		se.write(c);
	}
	//           
	public void write(char cbuf[], int off, int len) throws IOException {
		se.write(cbuf, off, len);
	}
	//          
	public void write(String str, int off, int len) throws IOException {
		se.write(str, off, len);
	}
	//     。    ,               flush()   ,     ,              OutputStreamWriter   。
	public void flush() throws IOException {
		se.flush();
	}
	//     。
	public void close() throws IOException {
		se.close();
	}
}
write()방법 을 호출 할 때마다 주어진 문자(또는 문자 집합)에서 인 코딩 변환 기 를 사용 합 니 다.바 텀 출력 흐름 을 기록 하기 전에 얻 은 이 바이트 들 은 버퍼 에 누적(write()방법 에 전달 하 는 문자 가 버퍼 가 없고 출력 배열 에 만 버퍼 가 있 습 니 다).최고 효율 을 얻 기 위해 서 는 컨버터 가 자주 호출 되 지 않도록 Output Stream Writer 를 Buffered Writer 에 포장 하 는 것 을 고려 할 수 있 습 니 다.
2)BufferedWriter
버퍼 가 있 는 문자 출력 흐름:Output StreamWriter 의 버퍼 와 달리 Buffered Writer 의 버퍼 는 자신 이 만 든 버퍼 배열 에 의 해 이 루어 집 니 다.따라서 인 코딩 변환 기 를 자주 호출 하여 버퍼 링 할 필요 가 없습니다.또한 단일 문자,배열,문자열 의 버퍼 링 을 제공 할 수 있 습 니 다.(인 코딩 변환 기 는 문자 배열 과 문자열 만 버퍼 링 할 수 있 습 니 다.)
Buffered Writer 는 생 성 할 때 출력 스 트림 Writer 를 포장 하여 출력 흐름 에 버퍼 를 만 들 수 있 습 니 다.
그리고
void write(char[] cbuf, int off, int len)
문자 배열 의 일부분 을 기록 합 니 다.
void write(int c)
단일 문자 쓰기.
void write(String s, int off, int len)
문자열 의 일부분 을 기록 합 니 다.
버퍼 에 데 이 터 를 기록 합 니 다.
그런대로 통과 할 수 있다
void newLine()
줄 구분 자 를 기록 합 니 다.
마지막 으로 버퍼 의 데이터 새로 고침 을 수 동 으로 제어 할 수 있 습 니 다.
void flush()가 이 흐름 의 버퍼 를 새로 고 칩 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기