如何用Java压缩文件
时间:2020-01-09 10:35:31 来源:igfitidea点击:
这篇文章显示了如何使用Java压缩文件。使用此处提供的选项,我们可以通过指定所有文件来压缩单个文件或者多个文件。
用Java压缩文件
要用Java压缩文件,有两个选项
- 使用驻留在java.util.zip包中的ZipOutputStream和ZipEntry类。
- 使用Zip文件系统提供程序– zip文件系统提供程序将zip或者JAR文件视为文件系统,并提供了处理文件内容的功能。 zip文件系统提供程序是在JDK 7版本中引入的。
要压缩文件夹,请查看此文章如何在Java中压缩文件夹
使用ZipOutputStream在Java中压缩单个fie
使用ZipOutputStream压缩文件的步骤如下:
创建一个InputStream来读取源文件。
为该zip文件创建一个OutputStream并将其包装在ZipOutputStream对象中。
为源文件创建一个ZipEntry实例,并将其添加到ZipOutputStream。
从源文件读取数据并将其写入ZIP文件。
关闭流。
public class ZipFile {
public static void main(String[] args) {
// source file
String fileName = "F:\theitroad\links.txt";
File file = new File(fileName);
//Creating zipfile name from fileName by
// truncating .txt and appending .zip
String zipFilename = fileName.substring(0, fileName.indexOf('.')) + ".zip";
File zipFile = new File(zipFilename);
zipFile(file, zipFile);
}
// Method to zip file
private static void zipFile(File file, File zippedFile){
final int BUFFER = 1024;
ZipOutputStream zos = null;
BufferedInputStream bis = null;
try{
FileInputStream fis = new FileInputStream(file);
bis = new BufferedInputStream(fis, BUFFER);
// Creating ZipOutputStream for writing to zip file
FileOutputStream fos = new FileOutputStream(zippedFile);
zos = new ZipOutputStream(fos);
// Each file in the zipped archive is represented by a ZipEntry
// Only source file name is needed
ZipEntry ze = new ZipEntry(file.getName());
zos.putNextEntry(ze);
byte data[] = new byte[BUFFER];
int count;
while((count = bis.read(data, 0, BUFFER)) != -1) {
zos.write(data, 0, count);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
zos.close();
bis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
使用Zip文件系统提供程序压缩Java中的单个文件
我们可以使用java.nio.file.FileSystems类的工厂方法来创建新的zip文件系统或者获取对现有zip文件系统的引用。
我们可以通过以下方式指定zip或者JAR文件的路径来创建zip文件系统:
URI uri = URI.create(" jar:file:/ PATH / TO / ZIPFILE");
FileSystem fs = FileSystems.newFileSystem(uri,env);
public class ZipFile {
public static void main(String[] args) {
// source file
String fileName = "F:/theitroad/links.txt";
//Creating zipfile name from fileName by
// truncating .txt and appending .zip
String zipFilename = fileName.substring(0, fileName.indexOf('.')) + ".zip";
zipFile(fileName, zipFilename);
}
private static void zipFile(String file, String zippedFile){
Map<String, String> env = new HashMap<>();
env.put("create", "true");
// locate file system by using the syntax
// defined in java.net.JarURLConnection
URI uri = URI.create("jar:file:/" + zippedFile);
try (FileSystem zipfs = FileSystems.newFileSystem(uri.normalize(), env)) {
Path sourceFile = Paths.get(file);
System.out.println("Name-- " + sourceFile.getFileName().toString());
Path pathInZipfile = zipfs.getPath(sourceFile.getFileName().toString());
// copy a file into the zip file
Files.copy(sourceFile, pathInZipfile, StandardCopyOption.REPLACE_EXISTING );
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
用Java压缩多个文件
这是一个使用ZipOutputStream在Java中压缩多个文件的示例,其中每个源文件都作为ZipEntry添加到ZipOutputStream。
public class ZipFile {
public static void main(String[] args) {
try {
// source files
String file1 = "F:/theitroad/links.txt";
String file2 = "F:/theitroad/Test/postend.txt";
// Zipped file name
String zipFilename = "F:/theitroad/result.zip";
File zipFile = new File(zipFilename);
// Creating ZipOutputStream for writing to zip file
FileOutputStream fos = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(fos);
zipFile(file1, zos);
zipFile(file2, zos);
zos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Method to zip file
private static void zipFile(String fileName, ZipOutputStream zos) throws IOException{
final int BUFFER = 1024;
BufferedInputStream bis = null;
try{
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file);
bis = new BufferedInputStream(fis, BUFFER);
// Each file in the zipped archive is represented by a ZipEntry
// Only source file name is needed
ZipEntry zipEntry = new ZipEntry(file.getName());
zos.putNextEntry(zipEntry);
byte data[] = new byte[BUFFER];
int count;
while((count = bis.read(data, 0, BUFFER)) != -1) {
zos.write(data, 0, count);
}
zos.closeEntry();
} finally{
try {
bis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

