首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高效的ByteArrayInputStream操作

高效的ByteArrayInputStream操作
EN

Stack Overflow用户
提问于 2012-03-16 03:32:07
回答 2查看 636关注 0票数 2

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

执行此操作的最有效方法是什么?

我的下意识反应是将流读入byte数组,找到开始标记的结尾,找到结束标记的开头,然后将中间部分复制到另一个byte数组中;但这似乎效率相当低,而且我正在处理的文本有时可能很大(128KB)。我希望有一种方法可以在没有额外byte数组的情况下做到这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-16 04:02:34

在读取流的同时进行搜索和转换。

代码语言:javascript
复制
// find the start tag
byte[] startTag = new byte[]{'<', 't', 'a', 'g', '>'};
int fnd = 0;
int tmp = 0;
while((tmp = stream.read()) != -1) {
 if(tmp == startTag[fnd]) 
  fnd++;
 else
  fnd=0;
 if(fnd == startTage.size()) break;
}

// get base64 bytes
while(true) {
 int a = stream.read();
 int b = stream.read();
 int c = stream.read();
 int d = stream.read();
 byte o1,o2,o3; // output bytes
 if(a == -1 || a == '<') break;
 //
 ...
 outputStream.write(o1);
 outputStream.write(o2);
 outputStream.write(o3);
}

注意以上代码是在我的web浏览器中编写的,因此可能存在语法错误。

票数 0
EN

Stack Overflow用户

发布于 2012-03-16 03:39:15

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

从右侧扫描

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

base 64的内容位于这两个位置之间,是独占的。

您可以使用以下命令调整第二个数组的大小

代码语言:javascript
复制
((end - start + 3) / 4) * 3

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

如果你想要真正的花哨,因为你知道数组的前几个字节包含可以忽略的标记数据,并且编码的数据比输入的数据小,你可以在当前的字节缓冲区上破坏性地解码数据。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9726821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档