gpt4 book ai didi

java - 当输入流开始读取时,输出流开始写入

转载 作者:行者123 更新时间:2023-11-30 06:01:58 25 4
gpt4 key购买 nike

我想通过 http 发送一个大对象(比如说 4G)。

我们有一个自定义序列化器,可以将对象写入 OutputStream。目前,我们将对象写入磁盘并将该文件用作用于请求的输入流。

类似这些行:

private static Response sendObject(Object bigObject) throws IOException {
File tempFile = File.createTempFile("x", "y");
OutputStream out = new FileOutputStream(tempFile);
CustomSerializer.serialize(bigObject, out);
out.close();

WebTarget resource = service.path("data");

FormDataMultiPart multiPartEntity = new FormDataMultiPart();

InputStream inputStream = new FileInputStream(tempFile);
StreamDataBodyPart streamBodyPart = new StreamDataBodyPart(
"data",
inputStream,
"data",
MediaType.APPLICATION_OCTET_STREAM_TYPE);

MultiPart multiPart = multiPartEntity.bodyPart(streamBodyPart);
return resource.request(MediaType.APPLICATION_JSON_TYPE)
.post(Entity.entity(multiPart, multiPart.getMediaType()));
}

我们节省了一些内存,因为我们没有序列化为内存中的字节数组。那很好。但是我可以节省内存而不写入磁盘吗?

是否可以直接写入输入流而不重写 CustomSerializer?

您可以在读取请求时直接写入输入流吗?

-

这有点难以解释,但我想我追求的是这样的伪代码:

private static Response sendObject(Object bigObject) throws IOException {
WebTarget resource = service.path("data");

FormDataMultiPart multiPartEntity = new FormDataMultiPart();

// A type of stream I don't know if exist
OutputStream outIn = new OutputInputStream() {
public void openInputStream() {
CustomSerializer.serialize(bigObject, this);
}
};
StreamDataBodyPart streamBodyPart = new StreamDataBodyPart(
"data",
outIn.getInputStream(),
"data",
MediaType.APPLICATION_OCTET_STREAM_TYPE);

MultiPart multiPart = multiPartEntity.bodyPart(streamBodyPart);
return resource.request(MediaType.APPLICATION_JSON_TYPE)
.post(Entity.entity(multiPart, multiPart.getMediaType()));
}

最佳答案

您可以使用 StreamingOutput 并使用 CustomSerializer 写入提供的 OutputStream

StreamingOutput entity = new StreamingOutput() {
@Override
public void write(OutputStream out)
throws IOException, WebApplicationException {

CustomSerializer.serialize(bigObject, out);
}
};

Jersey 将调用 write() 方法,让您有机会直接写入响应实体流。

然后只需使用 FormDataBodyPart

BodyPart bigPart = new FormDataBodyPart(
"data", entity, MediaType.APPLICATION_OCTET_STREAM_TYPE);
MultiPart multiPart = new FormDataMultiPart().bodyPart(bigPart);

关于java - 当输入流开始读取时,输出流开始写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52071015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com