2012-03-15 41 views
2

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

什么是最有效的方法来做到这一点?

我的反应是将流读入byte数组,找到开始标记的结尾,找到结束标记的开始,然后将中间部分复制到另一个byte数组中;但这似乎相当低效,我正在使用的文本有时可能很大(128KB)。我想要一个方法来做到这一点,没有额外的byte阵列。

+2

谁创建了'ByteArrayInputStream'以开始?你能把它变成你自己的类型吗? – 2012-03-15 19:34:55

+0

鉴于我知道的所有Base64解码器都假设它们在整个字节[]上运行,所以我没有看到如何避免将数据复制到新阵列中。 – 2012-03-15 21:39:18

回答

0

在阅读信息流时进行搜索和转换。

// 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); 
} 

上面写在我的网页浏览器,所以可能存在语法错误。

+0

所以我只是用base64解码每个4字节的集合呢?这将很好,能够直接写入输出流。我想知道这是否会对性能产生影响? – 2012-04-18 14:07:46

2

Base 64不会使用字符<>所以我假设您使用的是web安全的base64变体,这意味着您无需担心内容中的HTML实体或注释。从寻找'<'

  1. 扫描: 如果你真的确认内容有这种形式,然后执行以下操作。这将是close标签的开始。
  2. 从该位置向左扫描,寻找'>'。这将是开始标记的结尾。

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

可以通过使用

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

作为对解码的内容长度的上限前胶料的第二阵列,然后b64decode进去。这是有效的,因为每4个base64数字编码3个字节。因为您知道数组的前几个字节包含可忽略的标记数据,并且编码的数据比输入小,所以您可以通过当前字节缓冲区破坏性地解码数据。