2009-11-18 5 views

답변

16

가장 쉬운 방법은 다른 쓰기 요청을 전달하지만 내부 카운터는 유지하는 또 다른 OutputStream 구현에이 방법을 사용하는 것입니다. 그런 다음에 그 대신에 글을 씁니다. 구현하기에는 너무 어렵지 않아야합니다. 실제로 이미 하나가있을 수 있습니다.

편집 : 합리적인 이름 (CountingOutputStream)으로 추측하면 Apache Commons IO에 구현 된 것입니다.

EDIT : HTTP 용으로 클라이언트가 아직 전체 데이터를 버퍼링하지 않고있는 경우 (은 콘텐츠 길이를 초과 할 수 있음) 을 쓰고 나서 데이터를 쓰려고하기 때문에 문제가 있습니다. 경우에 따라 특정 크기 (클라이언트가 버퍼링 한)까지 작동 한 다음 실패 할 수도 있습니다. 이 경우 데이빗의 해결책이 적절할 것입니다.

+0

U, Apache Commons! 나는 아파치 커먼스를 잊지 않고 시작해야한다 !!! 나는 시도 할 것이다. – Trick

+0

작동 중입니다. – Trick

+0

대용량 데이터에서도 작동합니까? David의 언급과 마찬가지로 응답의 outputStream에 무엇이든 쓰기 전에 "Content-length"헤더를 설정해야합니다. –

2

자신의 ByteArrayOutputStream에 쓰기를 고려하고 맨 끝에 응답 출력 스트림으로 플러시 할 수 있습니다.

+5

그러나 byte []의 모든 바이트가 JVM 메모리의 1 바이트를 먹으면서 메모리가 매우 많이 소모됩니다. – BalusC

8

출력 스트림에 데이터 쓰기를 시작하기 전에 응답 헤더에 콘텐츠 길이를 설정해야한다는 점이 문제입니다. 따라서 옵션은 다음과 같습니다.

  1. ByteOutputStream을 사용하여 데이터를 [] 배열에 쓴 다음 데이터 크기가되면 응답 출력 스트림에 복사합니다. 그러나 대용량 파일을 작성하는 경우 이는 분명히 옵션이 아닙니다.
  2. 임시 파일에 데이터를 쓴 다음 파일 크기를 얻으면이를 응답 출력으로 복사하십시오. 당신이하는 일에 따라, 이것은 용납 될 수없는 성능 저하를 가져올 수 있습니다.
  3. 처음부터 데이터를 생성하는 것이 얼마나 비쌉니까, 한 번 생성하여 버려 수를 가져 와서 다시 생성 할 수 있습니다. 이것이 현실적인 해결책이 될 것 같지는 않습니다.
  4. 응답 헤더에서 콘텐츠 길이를보고 할 수 없다는 사실에 자신을 사칭하십시오.