我有这样的方法
public void put(@Nonnull final InputStream inputStream, @Nonnull final String uniqueId) throws PersistenceException {
// a.) create gzip of inputStream
final GZIPInputStream zipInputStream;
try {
zipInputStream = new GZIPInputStream(inputStream);
} catch (IOException e) {
e.printStackTrace();
throw new PersistenceException("Persistence Service could not received input stream to persist for " + uniqueId);
}
我婉转换inputStream
为zipInputStream
,什么是做到这一点的呢?
将Java流对我来说真的很困惑,我不使他们的权利
的GZIPInputStream
是用来解压缩传入InputStream
。 要压缩传入InputStream
使用GZIP,基本上你需要将它写入GZIPOutputStream
。
你可以得到一个新InputStream
出来的,如果你使用ByteArrayOutputStream
写gzip压缩内容到byte[]
和ByteArrayInputStream
把一个byte[]
到InputStream
。
所以,基本上是:
public void put(@Nonnull final InputStream inputStream, @Nonnull final String uniqueId) throws PersistenceException {
final InputStream zipInputStream;
try {
ByteArrayOutputStream bytesOutput = new ByteArrayOutputStream();
GZIPOutputStream gzipOutput = new GZIPOutputStream(bytesOutput);
try {
byte[] buffer = new byte[10240];
for (int length = 0; (length = inputStream.read(buffer)) != -1;) {
gzipOutput.write(buffer, 0, length);
}
} finally {
try { inputStream.close(); } catch (IOException ignore) {}
try { gzipOutput.close(); } catch (IOException ignore) {}
}
zipInputStream = new ByteArrayInputStream(bytesOutput.toByteArray());
} catch (IOException e) {
e.printStackTrace();
throw new PersistenceException("Persistence Service could not received input stream to persist for " + uniqueId);
}
// ...
必要时,可以更换ByteArrayOutputStream
/ ByteArrayInputStream
一个FileOuputStream
/ FileInputStream
上的临时文件,通过创建File#createTempFile()
特别是如果这些数据流可以包括同时使用时可能溢出机的可用内存大的数据。
GZIPInputStream是读书用gzip内容进行编码。
如果你的目标是采取常规的输入流,并在gzip格式压缩它,那么你需要将这些字节写入GZIPOutputStream 。
又见这个回答一个相关的问题 。