Java 高效的ByteArrayInputStream操作

Java 高效的ByteArrayInputStream操作,java,bytearray,bytearrayinputstream,Java,Bytearray,Bytearrayinputstream,我正在使用一个ByteArrayInputStream,它包含一个XML文档,该文档由一个元素组成,元素的内容是一个大的base 64编码字符串。我需要删除周围的标签,以便我可以解码文本并将其输出为pdf文档 最有效的方法是什么 我下意识的反应是将流读入字节数组,找到开始标记的结尾,找到结束标记的开头,然后将中间部分复制到另一个字节数组中;但这似乎效率很低,而且我正在处理的文本有时可能很大(128KB)。我想要一种不使用额外的字节数组的方法。Base 64不使用字符,因此我假设您使用的是web安

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

最有效的方法是什么


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

Base 64不使用字符
,因此我假设您使用的是web安全的base64变体,这意味着您不必担心内容中的HTML实体或注释。 如果确实确定内容包含此表单,请执行以下操作:

  • 从右侧扫描,查找
    ''
    。这将是开始标记的结尾
  • base 64内容位于这两个位置之间,是独占的

    您可以使用

    ((end - start + 3) / 4) * 3
    
    作为解码内容长度的上限,然后B64解码成它。这是因为每4个base64位编码3个字节


    如果你真的想变得有趣,因为你知道数组的前几个字节包含可忽略的标记数据,并且编码的数据小于输入,你可以通过当前字节缓冲区对数据进行破坏性解码。

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

    // 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);
    }
    
    //查找开始标记
    字节[]开始标记=新字节[]{''};
    int-fnd=0;
    int-tmp=0;
    而((tmp=stream.read())!=-1){
    如果(tmp==startTag[fnd])
    fnd++;
    其他的
    fnd=0;
    如果(fnd==startTage.size())中断;
    }
    //获取base64字节
    while(true){
    int a=stream.read();
    intb=stream.read();
    int c=stream.read();
    int d=stream.read();
    字节o1,o2,o3;//输出字节
    
    如果(a==-1 | | a=='谁首先创建了
    ByteArrayInputStream
    ?您能将其作为您自己类型的实例吗?假设我知道的所有Base64解码器都假定它们在整个字节上运行[],我不知道如何才能真正将数据复制到一个新数组中。因此,我将使用base64对每组4个字节进行解码?如果能够直接写入outputstream,那就太好了。我想知道这是否会对性能产生任何影响?