我在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版本问题,我在代码中缺少它。
答案 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来关闭BufferedReader
和InputStreamReader
(您根本不关闭,以及其他代码清洁问题。保持代码清洁,使您 更容易理解错误。
哦,最后但并非最不重要的是,首先使用ObjectOutputStream
编写对象,然后使用BufferedReader
读取它们是没有意义的。 ObjectOutputStream
生成二进制数据,如果您尝试将其解释为文本,则会变成垃圾。