如何在 java 中将 .zip 压缩为 .gz?
How to compress a .zip to a .gz in java?
我想将普通文件压缩为 .zip,然后在不创建新文件的情况下将其压缩为 gzip 文件。
例如假设我有一个pdf文档doc.pdf,我必须得到的是:doc.pdf.zip.gz
我不想创建一个名为 doc.pdf.zip
的新文件,然后打开它并对其进行 gzip。
我正在使用服务器从浏览器获取文件并return返回,这是我的功能:
public void ZIPandGZIP(String fileName, OutputStream os, String header) throws FileNotFoundException
{
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
DataOutputStream dos = new DataOutputStream(os);
try {
dos.writeBytes(header);
ZipOutputStream zpos = new ZipOutputStream(os);
zpos.putNextEntry(new ZipEntry(fileName));
GZIPOutputStream gos = (new GZIPOutputStream(zpos));
fis.read(data);
gos.write(data);
zpos.flush();
zpos.close();
gos.flush();
gos.close();
dos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我得到一个文件 doc.pdf.zip.gz
,但它有一个损坏的文件 doc.pdf
并且没有压缩,为什么??
我认为您可以为 zip 创建一个临时文件,将其添加到 gzip,然后删除创建的 zip。下面的代码示例应该可以帮助您。
public void ZIPandGZIP(String fileName, OutputStream os, String header) throws FileNotFoundException {
byte[] buffer = new byte[1024];
FileInputStream fis = null;
FileOutputStream fos = null;
ZipOutputStream zos = null;
File tempZipFile = File.createTempFile(fileName, ".zip")
try {
fos = new FileOutputStream(tempZipFile);
zos = new ZipOutputStream(fos);
ZipEntry ze = new ZipEntry(fileName);
zos.putNextEntry(ze);
fis = new FileInputStream(fileName);
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
zos.closeEntry();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (fis != null) {
fis.close();
}
if (zos != null) {
zos.close();
}
if (fos != null) {
fos.close();
}
}
addGzipFileToStream(tempZipFile, os, header);
}
private void addGzipFileToStream(File zipFile, OutputStream os, String header) throws FileNotFoundException {
byte[] buffer = new byte[1024];
DataOutputStream dos = null;
GZIPOutputStream gzos = null;
FileInputStream inputStream = null;
try {
dos = new DataOutputStream(os);
dos.writeBytes(header);
gzos = new GZIPOutputStream(os);
inputStream = new FileInputStream(zipFile);
int len;
while ((len = inputStream.read(buffer)) > 0) {
gzos.write(buffer, 0, len);
}
gzos.finish();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (inputStream != null) {
inputStream.close();
}
if (gzos != null) {
gzos.close();
}
if (dos != null) {
dos.close();
}
zipFile.delete();
}
}
希望对您有所帮助。
我想将普通文件压缩为 .zip,然后在不创建新文件的情况下将其压缩为 gzip 文件。
例如假设我有一个pdf文档doc.pdf,我必须得到的是:doc.pdf.zip.gz
我不想创建一个名为 doc.pdf.zip
的新文件,然后打开它并对其进行 gzip。
我正在使用服务器从浏览器获取文件并return返回,这是我的功能:
public void ZIPandGZIP(String fileName, OutputStream os, String header) throws FileNotFoundException
{
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
DataOutputStream dos = new DataOutputStream(os);
try {
dos.writeBytes(header);
ZipOutputStream zpos = new ZipOutputStream(os);
zpos.putNextEntry(new ZipEntry(fileName));
GZIPOutputStream gos = (new GZIPOutputStream(zpos));
fis.read(data);
gos.write(data);
zpos.flush();
zpos.close();
gos.flush();
gos.close();
dos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我得到一个文件 doc.pdf.zip.gz
,但它有一个损坏的文件 doc.pdf
并且没有压缩,为什么??
我认为您可以为 zip 创建一个临时文件,将其添加到 gzip,然后删除创建的 zip。下面的代码示例应该可以帮助您。
public void ZIPandGZIP(String fileName, OutputStream os, String header) throws FileNotFoundException {
byte[] buffer = new byte[1024];
FileInputStream fis = null;
FileOutputStream fos = null;
ZipOutputStream zos = null;
File tempZipFile = File.createTempFile(fileName, ".zip")
try {
fos = new FileOutputStream(tempZipFile);
zos = new ZipOutputStream(fos);
ZipEntry ze = new ZipEntry(fileName);
zos.putNextEntry(ze);
fis = new FileInputStream(fileName);
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
zos.closeEntry();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (fis != null) {
fis.close();
}
if (zos != null) {
zos.close();
}
if (fos != null) {
fos.close();
}
}
addGzipFileToStream(tempZipFile, os, header);
}
private void addGzipFileToStream(File zipFile, OutputStream os, String header) throws FileNotFoundException {
byte[] buffer = new byte[1024];
DataOutputStream dos = null;
GZIPOutputStream gzos = null;
FileInputStream inputStream = null;
try {
dos = new DataOutputStream(os);
dos.writeBytes(header);
gzos = new GZIPOutputStream(os);
inputStream = new FileInputStream(zipFile);
int len;
while ((len = inputStream.read(buffer)) > 0) {
gzos.write(buffer, 0, len);
}
gzos.finish();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (inputStream != null) {
inputStream.close();
}
if (gzos != null) {
gzos.close();
}
if (dos != null) {
dos.close();
}
zipFile.delete();
}
}
希望对您有所帮助。