目标VM发生异常:不是GZIP格式

时间:2015-05-09 10:35:34

标签: java exception gzipinputstream

我在java(版本1.7)中有一张地图

public void doTest() {
    try {
         Map<String, String> data = new HashMap<String, String>();
         data.put("Product", "someProduct");
         data.put("CreatedOn", "Fri May 08 02:25:03 IST 2015");
         data.put("Module", "someService");
         data.put("Type", "ERROR");
         data.put("Message", "LogId:635666739033286524 Message:WSClient.FetchReservation::WS FetchReservation calledSystem.Net.WebException: The operation has timed out at System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(WebRequest request) at System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest request) at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) at .BOTWSClient.ChannelDirectWS.YieldGain.fFetchReservation(String strReservationXML) at BOTWSClient.WSClient.FetchReservation(String RequestXML) ");
         data.put("IP", "");
         data.put("Name", "WriteLog");

         byte[] byteArray = convert(data);
         int response = port.writelogcollection(byteArray);

    } catch(Exception e) {
        e.printStackTrace();
    }
}

  public byte[] convert(Map obj) throws IOException {
   ObjectOutputStream os = null;

  ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
  os = new ObjectOutputStream(new GZIPOutputStream(byteStream));
  os.writeObject(obj);
  os.flush();
  byte[] sendBuf = byteStream.toByteArray();
  os.close();
 return sendBuf;

}

 public static String writelogcollection(byte[] bytes) throws IOException {
BufferedReader bf;
    String outStr;
    try (GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(bytes))) {
        bf = new BufferedReader(new InputStreamReader(gis, "UTF-8"));
        outStr = "";
        String line;
        while ((line = bf.readLine()) != null) {
            outStr += line;
        }
    }
    bf.close();
    return outStr;
}

我正在尝试使用GZIPInputStream但遇到异常

Exception occurred in target VM: Not in GZIP format 
    java.util.zip.ZipException: Not in GZIP format
    at java.util.zip.GZIPInputStream.readHeader(GZIPInputStream.java:164)
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:78)
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:90)

我确信它不是java版本问题,我在代码中缺少它。

1 个答案:

答案 0 :(得分:1)

您的错误在这里:

os.flush();
byte[] sendBuf = byteStream.toByteArray();
os.close();

应该是

os.flush();
os.close();
byte[] sendBuf = byteStream.toByteArray();

因为虽然flush()只写了到目前为止已写入的数据,但close()也写了一些正确形成gzip压缩对象流所需的重要元数据。

您的代码也存在不同的小问题,例如writelogcollection应为writeLogCollection,您应该使用try-with-resources来关闭BufferedReaderInputStreamReader(您根本不关闭,以及其他代码清洁问题。保持代码清洁,使您 更容易理解错误。

哦,最后但并非最不重要的是,首先使用ObjectOutputStream编写对象,然后使用BufferedReader读取它们是没有意义的。 ObjectOutputStream生成二进制数据,如果您尝试将其解释为文本,则会变成垃圾。