2008-09-24 3 views

답변

1

내 자신의 질문에 대답 : 당신은 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(); 
    } 
} 
+0

교수형? Readable API를 보면 버퍼가 꽉 찼다면 각 읽기마다 0을 반환하는 바쁜 루프에 기대할 수 있습니다.하지만 '읽으려는 시도'가 무엇인지 명시 적으로 말하지 않았으므로 추측입니다. 매달 기는 출력을 다중으로 쓰고 있기 때문에 출력을 차단했음을 의미 할 수 있습니다. –

+0

루프의 자세한 동작을 확인하지 않았습니다. 블록을 읽거나 반복적으로 0을 반환합니다. 순 효과 : 루프가 종료되지 않습니다. –

+0

출력 버퍼가 순환 버퍼와 같은 드레인되지 않는 유한 용량의 버퍼 여야합니다. 드문 경우입니다. 어쩌면 나는 일반적으로 "정지"를 사용하여 라이브 록보다는 교착 상태를 의미한다는 점에서 특이한 것일 수 있습니다. –

0

나는 교착 상태라고 가정합니다. in.read (buf)는 CharBuffer를 잠그고 out.append (buf) 호출을 방지합니다.

이것은 CharBuffer가 구현에서 잠금 (어떤 종류의)을 사용한다고 가정합니다. API는 클래스 CharBuffer에 대해 무엇이라고 말합니까?

편집 : 죄송합니다. 내 뇌에 어떤 종류의 단락이 있습니다 ... 다른 것과 혼란 스럽습니다.

0

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 구현하면 배관 문자를 경우에도 바람직 할 것입니다, 당신은 두 개의 문자 인코딩 사이의 변환을 지원해야하는 경우에만이를 사용하는 것이 좋습니다 것입니다.

관련 문제