我有一个类似的方法
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
,有什么办法吗?
- 上述方法不正确并抛出“不是 Zip 格式”的异常
转换 Java Streams 对我来说真的很困惑,我没有把它们做对
最佳答案
GZIPInputStream
用于解压传入的InputStream
.要使用 GZIP 压缩传入的 InputStream
,您基本上需要将其写入 GZIPOutputStream
。 .
如果你使用ByteArrayOutputStream
,你可以得到一个新的InputStream
。将压缩后的内容写入 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()
创建,尤其是当这些流可能包含大量数据时,这些数据在并发使用时可能会溢出机器的可用内存。
关于Java:如何将 InputStream 转换为 GZIPInputStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12322073/