Rya*_*ins 9 java io gzip gzipinputstream
我调用一个返回gzip压缩文件的服务.我javax.activation.DataHandler.getInputStream();从响应中将数据作为InputStream(礼貌).
我想要做的是,在不向磁盘写入任何内容的情况下,在归档文件中的文件中获取解压缩数据的InputStream.在这种情况下,压缩文件是一个xml文档,我试图解组使用javax.xml.bind.Unmarshaller它来获取InputStream.
我正在尝试将InputStream写入OutputStream(解压缩数据),然后我需要将其写回InputStream.它还没有工作,所以我想我会看看是否有更好的(我希望如此)方法.
我可以将初始InputStream写入磁盘并获取一个gz文件,然后读取该文件,从中获取压缩文件并从那里开始,但我宁愿将其全部保存在内存中也是可能的.
更新1:这是我的当前(不工作 - 得到"不是GZIP格式"的例外):
ByteArrayInputStream xmlInput = null;
try {
InputStream in = dh.getInputStream(); //dh is a javax.activation.DataHandler
BufferedInputStream bis = new BufferedInputStream(in);
ByteArrayOutputStream bo = new ByteArrayOutputStream();
int bytes_read = 0;
byte[] dataBuf = new byte[4096];
while ((bytes_read = bis.read(dataBuf)) != -1) {
bo.write(dataBuf, 0, bytes_read);
}
ByteArrayInputStream bin = new ByteArrayInputStream(bo.toByteArray());
GZIPInputStream gzipInput = new GZIPInputStream(bin);
ByteArrayOutputStream out = new ByteArrayOutputStream();
dataBuf = new byte[4096];;
bytes_read = 0;
while ((bytes_read = gzipInput.read(dataBuf)) > 0) {
out.write(dataBuf, 0, bytes_read);
}
xmlInput = new ByteArrayInputStream(out.toByteArray());
Run Code Online (Sandbox Code Playgroud)
如果不是写入ByteArrayOutputStream,而是第一次写入FileOutputStream我得到一个压缩文件(我可以手动打开以获取xml文件),服务(eBay)说它应该是一个gzip文件所以我'我不知道为什么我会收到"Not in GZIP format"错误.
更新2:我尝试了一些不同的东西 - 相同的错误("不是GZIP格式").哇,我只是试着用一个分号结束那个括号.无论如何,这是我的第二次尝试,但仍然不起作用:
ByteArrayInputStream xmlInput = null;
try {
GZIPInputStream gzipInput = new GZIPInputStream(dh.getInputStream());
ByteArrayOutputStream bo = new ByteArrayOutputStream();
int bytes_read = 0;
byte[] dataBuf = new byte[4096];
while ((bytes_read = gzipInput.read(dataBuf)) != -1) {
bo.write(dataBuf, 0, bytes_read);
}
xmlInput = new ByteArrayInputStream(bo.toByteArray());
Run Code Online (Sandbox Code Playgroud)
用 装饰输入流GZIPInputStream。
InputStream decompressed = new GZIPInputStream(compressed);
Run Code Online (Sandbox Code Playgroud)
下面的代码应该可以工作。请记住,您必须正确处理异常。
OutputStream out = null;
InputStream in = null;
try {
out = /* some output stream */;
in = new java.util.GZIPInputStream(/*some stream*/);
byte[] buffer = new byte[4096];
int c = 0;
while (( c = in.read(buffer, 0, 4096)) > 0) {
out.write(buffer, 0, c);
}
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9080 次 |
| 最近记录: |