我有像
这样的方法 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 Streams转换给我真是令人困惑,而且我没有把它们做对了
答案 0 :(得分:11)
GZIPInputStream
将用于解压缩传入的InputStream
。要使用GZIP压缩传入的InputStream
,您基本上需要将其写入GZIPOutputStream
。
如果您使用ByteArrayOutputStream
将gzip压缩内容写入InputStream
而ByteArrayInputStream
将byte[]
转换为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()
/ {{1}},尤其是在这些流中可以包含大数据,这些数据可能会在同时使用时溢出机器的可用内存。
答案 1 :(得分:5)
GZIPInputStream用于阅读 gzip编码内容。
如果你的目标是采用常规输入流并以GZIP格式压缩它,那么你需要将这些字节写入GZIPOutputStream。