java - 将编码的压缩字符串转换为Java中的普通字符串时仅读取一半内容

标签 java

    String request=new String("UEsDBBQACAAIAHhoEEMAAAAAAAAAAAAAAAABAAAAMe1X247bNhD9FWPfs7Ls7GYNMEwpirLZSKTCy3r9xIfEKAJkd4F4W7R/36FuFH2RW/S18IM5Zw6PRsMZUkSf/nz+Mftj//Pw/fXl4016O7+Z7V++vn77/vLbxxtrincPN58woipzin2xTBuMSF2XnBLDpXA5MQQjrh0XOX/kuSUl3qEkBqIZXBQyRhQr8KbIXC1LZ+AJh28HlBwTohmkklYYnMa0Do2Y1CrFBN1hu36K2YMH0ZIzYRyVQsO/D/8IQYRSL+1KSYQzu5rhOxA7AVFuVZ+WncbLe2DFUBxCm4qQqA5oZNXO8RwezgvOFMw7Bw6Y1paLtSPWbKTiZjfmn/qE1oUTtsoa4ciydT5yRRasDqcsDuoMJppXI2UbRWQVVPdqq9WH+XyezheyTn9FyciDDHkaBNs8gc45sCZa11KZEO8Jkiv+yFTQTo6B3q6ZqrgZEXrgUZpgBp3zsLZKkIphYUgpUdKbfYF1tK+/H95en93b/vA2VFqvUEioSZiT4h/7t9nzfvb28y9Iz4AOhAUO8CLASzwL+BKjNRM56M5R0o1QRaAIoNS0IcZqvEDJEYKgpZmThcu4MhucrpqFglaLcejx47plVV3KHVOdKSm1dbtWXavoGSwQh+cIg5KRu5nZthBEGoyg2OTxM8lIyWY5KChOTcsM7p7NwjKdILBgXOauw3O8uIMXOwahI6msmMuIyHGa+jcNNtKkJNBXRbMd+v3jPaz0MTaKrdvv8lwxrTtr4+U6aGjj0LRDnMT0LFdJYTZ+A7nssmJcopHVGk2WktG4KKVUYUpsQpYZGwke2b3ZikaWtplVmUe7gZHbpoubv379fLcNQ8XWbaf3A6BCh214DdhoXEuXyac+iJnfgsZA7+8eGFtx1rdSff5/Df77GvyrJYiTnsRdAcetIdR0Vk25qxWvfGP1h1nO4SiBw4zKnEHv3oP8NVakQxQjsfthlT7cLWOdU1YkYljJ6o0Uw65yTuOE1EhIs4Ed4XycyTVC8J8JMJn0BudpXMmU0/sqmfGSTUU9yRgRLsV92T3yXoj8otc7WUV4OdSbr6tfYCevraZE3FJ5a9etSMxrpm5ZprlheLvd3p6d0xOQvlqCyXWKnq6/5IpfT5ZeMu3W1yrzGkFPVuakV09V5pRTX63Mqww9VXqzSOBC5JdLc9Kr/2FpnvKaqZOlOSb4w2y8pSanN7fuUtdZhRW0+SJrPvgGCzHxxXKfP/gExIt5upw/pHC3ieBBCm5rTkh897753fnjJHIg/4HtZRe3/im95U8sTVXPghun/+5szq8R3LMyRQTdwJ3Ah5oOrAAjKWCxmLOadV/hyQnSAf7aAAdTHigB2erAr/k8/fCOwjhbZ7ZNw/x+tVymKzjZRkQ/ayQaW3HGk/HN+m9QSwcI78e6fhgEAACNDwAAUEsBAhQAFAAIAAgAeGgQQ+/Hun4YBAAAjQ8AAAEAAAAAAAAAAAAAAAAAAAAAADFQSwUGAAAAAAEAAQAvAAAARwQAAAAA");
    byte[] resByte=new byte[11474836];

    resByte=Base64.decode(request.toString().getBytes());

    InputStream input = new ByteArrayInputStream(resByte);

    byte[] readByte = new byte[11474836];

    ZipInputStream zip = new ZipInputStream(input);
    int noofbyteRead = 0;

    if ( zip.getNextEntry() != null )
    {
        noofbyteRead = zip.read(readByte);
    }
    byte[] writeByte = new byte[ noofbyteRead ];
    System.arraycopy( readByte,0,writeByte,0,noofbyteRead);

    zip.close();
    input.close();


    /* String actualXmlmessage = new String(writeByte);*/
    String s1 = new String(writeByte);
    System.out.println(s1);

s1 仅显示一半内容。为什么没有阅读完整内容?

最佳答案

在回答问题之前,让我先发表一些评论:

无需从字符串常量创建新的String

String request= "UEsDBBQACAAIAHhoE....." ;

Base64.decode 未收到 byte[] 来保存结果。因此,它很可能正在创建它返回的那个。因此,resByte 不需要初始化。 resByte 的声明应该只是

byte[] resByte;

也就是说,没有更多细节,指令 String s1 = new String(writeByte); 将使用平台默认编码(这取决于操作系统和操作系统配置)如果您没有手动设置)。如果您的编码是 UTF-16(其中每个字符对应 2 个字节),您将获得 writeByte 中字节数的一半字符。

如果 s1 看起来乱码(这与“一半内容”甚至“只是内容”非常不同,您应该在问题中指出这一点),那么这就是发生的情况几乎可以肯定。

解决方案是使用:

String s1= new String(writeByte,charSetName) ;

其中 charSetName 对应于原始输入的字符集(不仅在进行 Base-64 编码之前,而且甚至在压缩之前)。

关于java - 将编码的压缩字符串转换为Java中的普通字符串时仅读取一半内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18297143/

相关文章:

java - HTTP请求参数类型传播

java - Java Swing 还在使用吗?

java - Java中的回调函数

java - 从 jar 文件加载 eclipse 插件

java - 用正则表达式匹配两个url

java - 特定单词的正则表达式

java - Hiibernate : java. lang.ClassCastException : java. lang.String 无法转换为 java.lang.Integer

java - 二维数组

java - 扑克手评估与王牌

java - Java SQL 中的错误