我想将普通文件压缩为.zip,然后将其压缩为gzip文件,而不创建新文件。
例如,假设我有一个pdf文档 doc.pdf ,我必须得到的是:doc.pdf.zip.gz
我不想创建一个名为的新文件doc.pdf.zip
,然后将其打开并gzip。
我正在与服务器一起从浏览器获取文件并将其返回,这是我的功能:
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();
}
}
希望能帮助到你。
问题内容: 任何人都可以向我展示在我一直在搜索的Java中压缩和解压缩tar.gzip文件的正确方法,但是我能找到的最多是zip或gzip(单独)。 问题答案: 我最喜欢的是plexus-archiver-请参阅GitHub上的资源。 另一个选项是Apache commons- compress- (请参阅mvnrepository)。 使用plexus-utils,用于取消存档的代码如下所示:
我正在为嵌套在其他一些面板中的面板使用垂直BoxLayout。其他面板的大小会导致目标面板中的对象以不美观的方式展开。如何让面板在没有太多填充的情况下从上到下呈现对象? 下面是类似的代码,尽管它产生了填充整个面板的微调器,而不是相距甚远的普通微调器。
我试图压缩字符串上转换的Xml列表,将它们保存在一个zip文件中,并在restful上作为POST的主体返回。但是每次我保存文件时,都会出现错误“存档格式未知或损坏”。 有人能帮我吗?
我有许多zip文件,我需要分发给用户,大约130个。每个zip文件包含许多类似的文本、html、xml和jpg文件。zip文件总计146兆字节;解压缩后,它们的内容总计551MB。 我想以尽可能小的格式将所有这些文件一起分发给用户。我研究了两种不同的方法,每种方法都使用两种不同的压缩方案,zip和7zip(我理解它要么是LZMA要么是其变体): 将所有zip文件压缩到一个压缩文件中,并发送该文件(
问题内容: 我使用GZIPOutputStream或ZIPOutputStream压缩了一个字符串(我string.length()小于20),但是压缩后的结果比原始字符串长。 在某个站点上,我发现一些朋友说这是因为我的原始字符串太短,GZIPOutputStream可用于压缩较长的字符串。 因此,有人可以帮我压缩字符串吗? 我的功能是这样的: 更新: 问题答案: 压缩算法几乎总是具有某种形式的空
我有多个zip文件在一个文件夹和另一个zip文件存在于每一个这些zip文件夹。我想解压第一个和第二个zip文件夹,并创建它们自己的目录。 这是结构 如上所示,在中,我们有多个zip文件,在每个zip文件中,都存在另一个zip文件。我想解压缩,,和到新的文件夹中。我想使用与父zip文件夹相同的名称来放置每个结果。我尝试了以下答案,但这只解压缩第一个文件夹。 顺便说一句,我在Jenkins管道中运行这