谢谢提问!我遇到了完全相同的问题,而且很容易解决。通过阅读您的问题,听起来您可能正在尝试做我想做的事情,所以我想通过提供对我有用的解决方案来提供帮助。
在我的情况下,我试图为 jpg 编写 HTTP 响应,在这种情况下,文本标题部分后面将跟随二进制数据。这里的流是OutputStream
Java 的Socket
。
我正在使用 aPrintWriter
将文本写入套接字流,但随后我需要写入二进制数据。有一个简单的解决方案,它适用于二进制数据跟随文本数据的情况,并且在二进制数据之后没有更多的文本数据。
只需Printwriter
在流上打开 a 并使用 writer 将文本打印到流中,直到所有文本都被写入。然后将其刷新PrintWriter
到流中,但不要关闭它(这会关闭必须保持打开的底层流)。最后,将二进制数据直接写入流。
最后,您可以简单地关闭PrintWriter
以关闭底层流。
如果使用下面提供的类,您将:
HttpStreamWriterImpl
通过为OutputStream
底层提供 来构造Socket
。
writeLine()
根据需要反复调用。
writeBinary()
如果/根据需要打电话。
close()
完成后打电话。
例子:
public class HttpStreamWriterImpl implements Closeable
{
private @NotNull OutputStream stream;
private @NotNull PrintWriter printWriter;
public HttpStreamWriterImpl(@NotNull OutputStream stream)
{
this.stream = stream;
this.printWriter = new PrintWriter(stream, true, UTF_8);
}
public void writeLine(@NotNull String line)
{
printWriter.print(line);
printWriter.print(HTTP_LINE_ENDING);
}
public void writeBinary(@NotNull byte[] binaryContent) throws IOException
{
printWriter.flush();
stream.write(binaryContent);
stream.flush();
}
@Override
public void close()
{
printWriter.close();
}
}