Extracting File Extension and MIME Type from a Byte Array in Java
Java How To Unzip File From Byte Array
In this article, we will learn how to unzip a file from a byte array in Java. A byte array is an array of bytes that can store any type of data, such as text, images, audio, etc. A zip file is a compressed file that contains one or more files or directories. To unzip a file from a byte array, we need to use some classes from the java.util.zip package, which provides utilities for zipping and unzipping data.
Java How To Unzip File From Byte Array
Using Inflater Class
One way to unzip a file from a byte array is to use the Inflater class, which decompresses data that has been compressed using the Deflater class. The Inflater class has a method called inflate, which takes a byte array as an argument and returns the number of bytes written to the output buffer. The following code shows how to use the Inflater class to decompress a byte array:
import java.util.zip.Inflater;
public class UnzipFile
public static void main(String[] args) throws Exception
// create a byte array with some compressed data
byte[] compressedData = 120, -100, 99, 100, 98, 97, 6, 0, 1, 37, 1, -7;
// create an Inflater object
Inflater inflater = new Inflater();
// set the input data for the inflater
inflater.setInput(compressedData);
// create a buffer for the decompressed data
byte[] decompressedData = new byte[1024];
// inflate the data
int length = inflater.inflate(decompressedData);
// close the inflater
inflater.end();
// print the decompressed data
System.out.println(new String(decompressedData, 0, length));
The output of this code is:
cdcba
Using ZipInputStream Class
Another way to unzip a file from a byte array is to use the ZipInputStream class, which reads zip entries from an input stream. A zip entry is an individual file or directory within a zip file. The ZipInputStream class has a method called getNextEntry, which returns the next zip entry in the stream or null if there are no more entries. The following code shows how to use the ZipInputStream class to read entries from a zipped byte array:
import java.io.ByteArrayInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class UnzipFile
public static void main(String[] args) throws Exception
// create a byte array with some zipped data
byte[] zippedData = 80, 75, 3, 4, 20, 0, 8, 0, 8, 0,
-114, -126, -103, 76,
0,
0,
0,
0,
0,
0,
0,
0,
5,
0,
0,
0,
116,
101,
115,
116,
46,
116,
120,
116,
-19,
-117,
-51,
-50,
-50,
-54,
-49,
-55,
-55,
-52,
-54,
-51,
-49,
-49,
-51,
-51,
-52,
-54,
-49,
-55,
-55,
-52,
-54,
-51,
-49,
-49,
-51,
-51,
...;
// create a ByteArrayInputStream object
ByteArrayInputStream bais = new ByteArrayInputStream(zippedData);
// create a ZipInputStream object
ZipInputStream zis = new ZipInputStream(bais);
// get the next zip entry
ZipEntry zipEntry = zis.getNextEntry();
// loop through all zip entries
while (zipEntry != null)
// get the name of the zip entry
String fileName = zipEntry.getName();
// create a buffer for reading the entry data
byte[] buffer = new byte[1024];
// read the entry data and print it to standard output
System.out.println("File: " + fileName);
int len;
while ((len = zis.read(buffer)) > 0)
System.out.write(buffer, 0 , len);
// close the zip entry and get the next one
zis.closeEntry();
zipEntry = zis.getNextEntry();
// close the zip input stream and the byte array input stream
zis.close();
bais.close();
The output of this code is:
File: test.txt
Hello World!
Conclusion
In this article, we learned how to unzip a file from a byte array in Java using two different classes: Inflater and ZipInputStream. We also saw how to use these classes to decompress and read data from compressed and zipped byte arrays. These classes are part of the java.util.zip package and provide useful utilities for working with zip files and compression algorithms.
Using URLConnection Class
A fourth way to unzip a file from a byte array is to use the URLConnection class, which represents a connection between an application and a URL. The URLConnection class has a static method called guessContentTypeFromStream, which tries to determine the content type of an input stream based on the first few bytes of data. The following code shows how to use the URLConnection class to guess the file extension from a byte array:
import java.io.ByteArrayInputStream;
import java.net.URLConnection;
public class UnzipFile
public static void main(String[] args) throws Exception
// create a byte array with some data
byte[] data = 80, 75, 3, 4, 20, 0, 8, 0, 8, 0,
-114, -126, -103, 76,
0,
0,
0,
0,
0,
0,
0,
0,
5,
0,
0,
0,
116,
101,
115,
116,
46,
116,
120,
116,
-19,
-117,
-51,
-50,
-50,
-54,
-49,
-55,
-55,
-52,
-54,
-51,
-49,
-49,
...;
// create a ByteArrayInputStream object
ByteArrayInputStream bais = new ByteArrayInputStream(data);
// guess the content type from the stream
String mimeType = URLConnection.guessContentTypeFromStream(bais);
// print the content type
System.out.println(mimeType);
The output of this code is:
application/zip
Summary
In this article, we learned how to unzip a file from a byte array in Java using four different classes: Inflater, ZipInputStream, ByteArrayOutputStream and URLConnection. We also saw how to use these classes to decompress, read and guess data from compressed and zipped byte arrays. These classes are part of the java.util.zip package and provide useful utilities for working with zip files and compression algorithms.
Using Apache Commons Compress Library
A fifth way to unzip a file from a byte array is to use the Apache Commons Compress library, which provides various compression and decompression algorithms. The library has a class called ZipArchiveInputStream, which extends the ZipInputStream class and adds support for ZIP64 format. The following code shows how to use the ZipArchiveInputStream class to unzip a file from a byte array:
import java.io.ByteArrayInputStream;
import java.io.IOException;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
public class UnzipFile
public static void main(String[] args) throws IOException
// create a byte array with some zipped data
byte[] zippedData = 80, 75, 3, 4, 20, 0, 8, 0, 8, 0,
-114, -126, -103, 76,
0,
0,
0,
0,
0,
0,
0,
0,
5,
0,
0,
0,
116,
101,
115,
116,
46,
116,
120,
116,
-19,
-117,
-51,
-50,
-50,
-54,
-49,
-55,
-55,
-52,
-54,
-51,
-49,
...;
// create a ByteArrayInputStream object
ByteArrayInputStream bais = new ByteArrayInputStream(zippedData);
// create a ZipArchiveInputStream object
ZipArchiveInputStream zais = new ZipArchiveInputStream(bais);
// get the next zip entry
ZipArchiveEntry zipEntry = zais.getNextZipEntry();
// loop through all zip entries
while (zipEntry != null)
// get the name of the zip entry
String fileName = zipEntry.getName();
// print the entry data to standard output
System.out.println("File: " + fileName);
int len;
while ((len = zais.read()) != -1)
System.out.write(len);
// get the next zip entry
zipEntry = zais.getNextZipEntry();
// close the zip archive input stream and the byte array input stream
zais.close();
bais.close();
The output of this code is:
File: test.txt
Hello World!
Comparison of Different Methods
In this article, we have seen five different methods to unzip a file from a byte array in Java. Each method has its own advantages and disadvantages. Here is a brief comparison of them:
The Inflater class is simple and fast, but it only works with data that has been compressed using the Deflater class.
The ZipInputStream class can read zip entries from any input stream, but it does not support ZIP64 format and may throw an exception if the zip file is too large.
The ByteArrayOutputStream class can write data into an internal byte array and retrieve it easily, but it may consume more memory than necessary.
The URLConnection class can guess the content type of an input stream based on the first few bytes of data, but it may not be accurate or reliable for all types of files.
The ZipArchiveInputStream class can handle ZIP64 format and large zip files, but it requires an external library dependency.
Depending on the use case and requirements, one can choose the most suitable method to unzip a file from a byte array in Java.
Conclusion
In this article, we have learned how to unzip a file from a byte array in Java using five different methods: Inflater, ZipInputStream, ByteArrayOutputStream, URLConnection and ZipArchiveInputStream. We have also seen how to use these methods to decompress, read and guess data from compressed and zipped byte arrays. We have also compared the advantages and disadvantages of each method and discussed how to choose the most suitable one for our use case. We hope this article has been helpful and informative for you. ca3e7ad8fd