gpt4 book ai didi

java - 在 Android/Java 中使用 JSON/Base64 编码的文件

转载 作者:可可西里 更新时间:2023-11-01 16:36:27 25 4
gpt4 key购买 nike

我有一个网络服务能够以两种方式返回 PDF 文件:

RAW:文件仅包含在响应正文中。例如:

HTTP/1.1 200 OK
Content-Type: application/pdf

<file_contents>

JSON:文件经过编码(Base 64)并作为具有以下结构的 JSON 提供:

HTTP/1.1 200 OK
Content-Type: application/json

{
"base64": <file_contents_base64>
}

我希望能够使用以下架构在 Android/Java 上使用这两种服务:

// Get response body input stream (OUT OF THE SCOPE OF THIS QUESTION)
InputStream bodyStream = getResponseBodyInputStream();

// Get PDF file contents input stream from body stream
InputStream fileStream = getPDFFileContentsInputStream(bodyStream);

// Write stream to a local file (OUT OF THE SCOPE OF THIS QUESTION)
saveToFile(fileStream);

对于第一种情况(RAW 响应),响应主体将是文件本身。这意味着 getPDFFileContentsInputStream(InputStream) 方法实现很简单:

@NonNull InputStream getPDFFileContentsInputStream(@NonNull InputStream bodyStream) {
// Return the input
return bodyStream;
}

问题是:第二种情况(JSON响应)如何实现getPDFFileContentsInputStream(InputStream)方法?

最佳答案

您可以使用任何 json 解析器(如 Jackson 或 Gson),然后使用来自 apache-commons 编解码器的 Base64InputStream

编辑:您可以使用 ByteArrayInputStream 从字符串中获取输入流,即

InputStream stream = new ByteArrayInputStream(exampleString.getBytes(StandardCharsets.UTF_8));

如前所述here .

编辑 2: 这将导致 2 次传递数据,如果文件很大,您可能会遇到内存问题。要解决它, 您可以使用 Jackson 并自己解析内容,如 this示例而不是通过反射获取整个对象。 您可以将原始输入流包装在另一个输入流中,比如 ExtractingInputStream,这将跳过底层输入流中的数据,直到编码部分。然后您可以将此 ExtractingInputStream 实例包装在 Base64InputStream 中。跳过不必要部分的简单算法如下:在 ExtractingInputStream 的构造函数中,跳过直到读完三个引号。在read方法中,返回底层流返回的内容,如果底层流返回引号则返回-1,引号对应base 64编码数据的结尾。

关于java - 在 Android/Java 中使用 JSON/Base64 编码的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42352402/

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