尝试将它们与Transfer-Encoding: chunked 一起发送。更多详情在wikipedia。
更新根据 cmets,下面是 Java 中“ChunkedOutputStream”的示例:
package com.stackoverflow.q2395192;
import java.io.IOException;
import java.io.OutputStream;
public class ChunkedOutputStream extends OutputStream {
private static final byte[] CRLF = "\r\n".getBytes();
private OutputStream output = null;
public ChunkedOutputStream(OutputStream output) {
this.output = output;
}
@Override
public void write(int i) throws IOException {
write(new byte[] { (byte) i }, 0, 1);
}
@Override
public void write(byte[] b, int offset, int length) throws IOException {
writeHeader(length);
output.write(CRLF, 0, CRLF.length);
output.write(b, offset, length);
output.write(CRLF, 0, CRLF.length);
}
@Override
public void flush() throws IOException {
output.flush();
}
@Override
public void close() throws IOException {
writeHeader(0);
output.write(CRLF, 0, CRLF.length);
output.write(CRLF, 0, CRLF.length);
output.close();
}
private void writeHeader(int length) throws IOException {
byte[] header = Integer.toHexString(length).getBytes();
output.write(header, 0, header.length);
}
}
...基本上可以用作:
OutputStream output = new ChunkedOutputStream(response.getOutputStream());
output.write(....);
您在源代码中看到,每个数据块都存在一个标头,该标头代表十六进制数据的长度、一个 CRLF、实际数据和一个 CRLF。流的结尾由表示 0 长度和两个 CRLF 的标头表示。
注意:尽管有示例,但您实际上不需要在基于 JSP/Servlet 的 Web 应用程序中需要它。每当响应中没有设置内容长度时,webcontainer 会自动以块的形式传输它们。