Разница между ZipFile и ZipInputStream в Java

Опубликовано: 30 Ноября, 2021

Zip-файлы - это, по сути, архивный файл, который используется для сжатия всех файлов в одном месте. Это уменьшает занимаемое пространство памяти и упрощает транспортировку пакетов файлов. ZipInputStream, которые используются для чтения файловых записей в zip-файлах, присутствующих в zip-архиве. В Java есть два класса, а именно ZipFile и ZipInputStream, которые используются для чтения файловых записей, присутствующих в zip-файлах. Оба класса находятся внутри класса java.util.zip, и оба класса реализуют закрываемый интерфейс, поскольку они оба очень полезны при чтении и извлечении zip-файлов.

ZipFile класс используется для чтения файлов, сжатых в zip-файл. Этот класс предоставляет несколько методов для доступа к записям в zip-файле. Кроме того, в этом классе также присутствует несколько других методов, но сейчас это не предмет нашей заботы. Некоторые из них перечислены ниже:

  • ZipEntry getEntry (String name) : функция getEntry () является частью пакета java.util.zip. Функция возвращает ZipEntry файла, присутствующего в zip-файле, указанном строковым параметром. Этот метод используется для получения записи файла, имя которого указано в строковом параметре.
  • InputStream getInputStream (запись ZipEntry) : этот метод используется для создания входного потока для чтения данных записи (файла)
  • Перечисление <? extends ZipEntry> entries () : это очень важный метод, реализованный этим классом. Этот метод используется для генерации перечисления всех записей, к которым затем можно получить доступ индивидуально в любом порядке. Следовательно, этот метод обеспечивает непоследовательный доступ к файлам. Мы также можем получить доступ только к тем файлам, которые необходимы, и нам не требуется извлекать все файлы.

Реализация: вот как мы получаем доступ к классу zip-файла:

Ява

// Java Program to illustrate extraction of
// Zip file
// Importing classes and modules
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Scanner;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
// save as file named GFG.java
// Class
public class GFG {
// Step 1: Specify the file name
// with path of the zip file
// Custom directory from local directory
// is passed as an argument
public static String file_path
= "C:\Users\Dipak\Desktop\j.zip" ;
// Step 2: Specify the name of the file
// present in the zip file to be accessed
public static String file_name = "j/ritu.txt" ;
// Also do rememember that one can take input
// for the file path and name
// Using Zipinputstream method
public static BufferedInputStream b;
public static ZipInputStream z;
// Zipinputsream() method for implementation
public static void zipinputstream() throws IOException
{
z = new ZipInputStream(b);
ZipEntry e;
// If condition holds true
while ( true ) {
// Read the next ZIP file entry positioning
// the stream at begining
e = z.getNextEntry();
if (e == null )
break ;
if (e.getName().equals(file_name)) {
// Display message
System.out.println( "file size is "
+ e.getSize()
+ " bytes" );
}
}
}
// Main driver method
public static void main(String[] args) throws Exception
{
b = new BufferedInputStream(
new FileInputStream(file_path));
// calling static method
zipinputstream();
}
}

Выход:

ZipInputStream класс также используется для получения записей и метаданных файлов, присутствующих в zip-файле. Этот класс также реализует те же методы, что и вышеуказанный класс, за исключением двух следующих методов:

  • getInputStream () : сам этот класс является входным потоком, поэтому нет необходимости в реализации этого метода.
  • Перечисление <? extends ZipEntry> entries () : поскольку вышеуказанный метод не реализован в этом классе. Таким образом, мы не сможем получить произвольный доступ к какому-либо файлу или записи в zip-файле. Поэтому нам в основном нужно искать по всему zip-файлу, чтобы получить доступ к конкретному файлу. Этот класс предоставляет последовательный доступ к файлам в zip-файле.

Реализация: вот как получить доступ к классу ZipInputStream

Ява

// Java Program to illustrate extraction of
// ZipInputStream
// Importing classes and modules
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Scanner;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
// save as file named GFG.java
// CLass
public class GFG {
// file name with path of the zip file.
public static String file_path
= "C:\Users\Dipak\Desktop\j.zip" ;
// name of the file present in the zip file to be
// accessed.
public static String file_name = "j/gfg.txt" ;
// we can also take input for the file path and name
// Using ZipFile method;
public static void zipfile() throws IOException
{
// creating an object of zip file class
ZipFile f = new ZipFile(file_path);
// getting all its entries
Enumeration<? extends ZipEntry> entry = f.entries();
// checking for the particulat file we require and
// printing its size
while (entry.hasMoreElements()) {
final ZipEntry e = entry.nextElement();
if (e.getName().equals(file_name))
System.out.println(
"size of file specified is "
+ e.getSize() + " bytes" );
}
}
public static void main(String[] args) throws Exception
{
// calling static method
zipfile();
}
}

Выход:

Hence, the main difference between the two classes is that one allows free movement and access of files (by creating enumeration) while other not. This leads to a large complexity issues while handling zip files with big data entries. Hence, we can see that accessing file using ZipFile class is much easier than ZipinputStream.

Вниманию читателя! Не прекращайте учиться сейчас. Ознакомьтесь со всеми важными концепциями Java Foundation и коллекций с помощью курса "Основы Java и Java Collections" по доступной для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .