java - 高效的 ByteArrayInputStream 操作

标签 java arrays bytearrayinputstream

我正在使用一个 ByteArrayInputStream,它包含一个 XML 文档,该文档由一个元素组成,该元素具有一个大的 Base 64 编码字符串作为该元素的内容。我需要删除周围的标签,以便我可以解码文本并将其输出为 pdf 文档。

最有效的方法是什么?

我下意识的 react 是将流读入一个byte数组,找到开始标记的末尾,找到结束标记的开头,然后将中间部分复制到另一个 >字节数组;但这似乎效率很低,而且我正在处理的文本有时可能很大(128KB)。我想要一种无需额外的 byte 数组即可完成此操作的方法。

最佳答案

Base 64 不使用字符 <>所以我假设您使用的是网络安全的 base64 变体,这意味着您无需担心内容中的 HTML 实体或注释。 如果您确实确定内容具有这种形式,请执行以下操作:

  1. 从右侧扫描寻找'<' 。这将是结束标记的开始。
  2. 从该位置向左扫描寻找 '>' 。这将是开始标记的结尾。

base 64 内容位于这两个位置之间,互斥。

您可以使用以下方法预设第二个数组的大小

((end - start + 3) / 4) * 3

作为解码内容长度的上限,然后对其进行b64decode。这是可行的,因为每 4 个 base64 数字编码 3 个字节。

如果您想变得非常奇特,因为您知道数组的前几个字节包含可忽略的标签数据,并且编码数据小于输入,所以您可以破坏性地解码当前字节缓冲区上的数据。

关于java - 高效的 ByteArrayInputStream 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9726821/

相关文章:

java - 尝试自动递增数据时获取 "ArrayIndexOutOfBoundsException"

java - 泛型的JSP编译错误

java - 为什么在检查字符时控件不进入 if 循环?

javascript - 如何将对象数组转换为嵌套对象数组?

java - 当主报表查询有多个结果集并且子报表作为参数输入时无法生成PDF?

Java 理解 ByteArrayOutputStream 和 ByteArrayInputStream

java - 是否可以设置操作栏主页按钮和应用程序 Logo 之间的填充?

javascript - 处理多种类型数据的AJAX请求

C++数组地址分配给指针

java - 如何获取 ByteArrayInputStream 并将其内容保存为文件系统上的文件