java String和String Builder问题

我正在开发一个项目,我必须从PHP服务器解密xml文本并解析为java,我已经使用CipherInputStream解密了xml文本,看到xml文件完全打印,但我面临一个奇怪的问题而试图将xml文本存储在java字符串中,我正在处理以下代码:

public String decrypt(InputStream Fis){ Cipher c = Cipher.getInstance(algo + "/CBC/NoPadding"); String add = ""; StringBuilder getAns = new StringBuilder(); c.init(Cipher.DECRYPT_MODE, key); CipherInputStream cis = new CipherInputStream(Fis , c); byte[] encData = new byte[16]; int dummy; while ((dummy = cis.read(encData)) != -1) { System.out.println(new String(encData, "UTF-8").trim()); add = (new String(encData, "UTF-8").trim()); getAns.append(add); } System.out.println(getAns); ... } 

它通过while循环中的第一个println语句在log cat中打印完整的XML文本。但是当打印StringBuilder getAns ,它只打印部分文本。

我也尝试过使用String:

 add = add + (new String(encData, "UTF-8").trim()); 

也使用ArrayList但它只打印部分文本。

我想这可能是由于一个愚蠢的错误,但我正在努力解决这个问题。 任何帮助将不胜感激。

您正在while条件中读取输入流中的一些字节:

 while ((dummy = cis.read(encData)) != -1) 

这已经填充了encData字节数组,在dummy变量中具有正确数量的读取字节。 之后你又读了一些字节:

 dummy = cis.read(encData); 

这会覆盖您之前读过的字节数。 删除该行!

最后发现了这个问题,它与System.out.pritnln() ,它对打印有一定的限制。 这个函数一次只能打印大约4060个字符,我通过使用getAns.substring(10000,15000);找到了这个getAns.substring(10000,15000);