문제

다음 방법이 왜 매달려 있습니까?

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);
    }
}

두 문자 인코딩으로 변환을 지원 해야하는 경우에만 사용하는 것이 좋습니다. 그렇지 않으면 바이트 버퍼/채널 또는 바이트 []/ioStream 구현이 문자를 배관하더라도 바람직합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top