다음 방법이 중단되는 이유는 무엇입니까?CharBuffer가 "파이핑"되는 이유는 무엇입니까?
public void pipe(Reader in, Writer out) { CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE); while(in.read(buf) >= 0) { out.append(buf.flip()); } }
다음 방법이 중단되는 이유는 무엇입니까?CharBuffer가 "파이핑"되는 이유는 무엇입니까?
public void pipe(Reader in, Writer out) { CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE); while(in.read(buf) >= 0) { out.append(buf.flip()); } }
내 자신의 질문에 대답 : 당신은 buf.clear()
read
사이의 전화를해야합니다. 아마도 버퍼가 꽉 찼기 때문에 read
이 매달려 있습니다. 올바른 코드는
public void pipe(Reader in, Writer out) { CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE); while(in.read(buf) >= 0) { out.append(buf.flip()); buf.clear(); } }
나는 교착 상태라고 가정합니다. in.read (buf)는 CharBuffer를 잠그고 out.append (buf) 호출을 방지합니다.
이것은 CharBuffer가 구현에서 잠금 (어떤 종류의)을 사용한다고 가정합니다. API는 클래스 CharBuffer에 대해 무엇이라고 말합니까?
편집 : 죄송합니다. 내 뇌에 어떤 종류의 단락이 있습니다 ... 다른 것과 혼란 스럽습니다.
CharBuffers는 예상대로 독자 및 작성자와 정상적으로 작동하지 않습니다. 특히 Writer.append(CharBuffer buf)
메소드가 없습니다. 질문 스 니펫에서 호출하는 메서드는 Writer.append(CharSequence seq)
이며 seq.toString()
을 호출합니다. CharBuffer.toString()
메서드는 버퍼의 문자열 값을 반환하지만 버퍼를 소모하지는 않습니다. 이후의 Reader.read(CharBuffer buf)
호출은 이미 전체 버퍼를 가져오고 따라서 0을 반환하여 루프를 계속 무기한 수행합니다.
이것은 멈춤처럼 느껴지 긴하지만 실제로 루프를 통과 할 때마다 첫 번째 읽기의 버퍼 내용을 작성자에게 추가합니다. 따라서 대상에서 많은 출력을 보게되거나 라이터가 구현되는 방식에 따라 라이터의 내부 버퍼가 커집니다.
CharBuffer 솔루션이 루프를 통과 할 때마다 적어도 두 개의 새로운 char []를 작성하기 때문에 char [] 구현을 권장합니다.
public void pipe(Reader in, Writer out) throws IOException {
char[] buf = new char[DEFAULT_BUFFER_SIZE];
int count = in.read(buf);
while(count >= 0) {
out.write(buf, 0, count);
count = in.read(buf);
}
}
나는 그렇지 ByteBuffer를/채널 또는 바이트 []/IOStream 구현하면 배관 문자를 경우에도 바람직 할 것입니다, 당신은 두 개의 문자 인코딩 사이의 변환을 지원해야하는 경우에만이를 사용하는 것이 좋습니다 것입니다.
교수형? Readable API를 보면 버퍼가 꽉 찼다면 각 읽기마다 0을 반환하는 바쁜 루프에 기대할 수 있습니다.하지만 '읽으려는 시도'가 무엇인지 명시 적으로 말하지 않았으므로 추측입니다. 매달 기는 출력을 다중으로 쓰고 있기 때문에 출력을 차단했음을 의미 할 수 있습니다. –
루프의 자세한 동작을 확인하지 않았습니다. 블록을 읽거나 반복적으로 0을 반환합니다. 순 효과 : 루프가 종료되지 않습니다. –
출력 버퍼가 순환 버퍼와 같은 드레인되지 않는 유한 용량의 버퍼 여야합니다. 드문 경우입니다. 어쩌면 나는 일반적으로 "정지"를 사용하여 라이브 록보다는 교착 상태를 의미한다는 점에서 특이한 것일 수 있습니다. –