How can I wrap a GZipInputStream with a BufferedInputStream?
I have FileReadClient
one that reads a file like this:
public synchronized int read (byte buf[], int off, int len) throws IOException {
if (br == null){
if (useGZIP) {
br = new BufferedInputStream(new GZIPInputStream(blockStream));
} else {
br = new BufferedInputStream(blockStream);
}
}
int result = br.read(buf, off, len);
return result;
}
Here is mine FileDownloadServlet
, which reads the contents of a file and writes it toServletOutputStream
InputStream fileStream; //This is an instance of `FileReadClient`
int c = 0;
int BUF_LEN = 4096;
byte bufr[] = new byte[BUF_LEN];
while ((c = fileStream.read(bufr, 0, BUF_LEN)) != -1) {
servletOutStream.write(bufr, 0, c);
}
I am saving the file as compressed, so when reading the original file, my file is decompressed using GZIPInputStream
which is inFileReadClient
Case 1:
All I could see was my call read()
FileReadClient
reads 8192
bytes completely , and mine FileDownloadServlet
reads 4096
bytes twice . I couldn't figure out how it reads the bytes first 8192
, although I gave the buffer length as 4096
when calling read ().
Case 2:
Now I am reading a file in compressed format from FileReadClient
and passing it to my input stream
public class MyInputStream extends java.io.InputStream {
String filepath = "";
boolean decompressByFileReadClient = true;
InputStream in;
public MyInputStream(Sting filepath, boolean decompressByFileReadClient) {
this.filepath = filepath;
initInputStream();
}
public void initInputStream() {
this.in = new FileReadClient(); //This reads data as compressed from file read client
if(!decompressByFileReadClient) {
this.in = new GZIPInputStream(this.in); //Pass "FileReadClient" input stream to GZIPInputStream to decompress the file content here
//This reads only 512 bytes at a time - since the default buffer size for GZIPInputStream is 512 bytes
}
}
}
Now that I read the content of my file from FileDownloadServlet
with MyInputStream
, I could only read 512 bytes of data, although I wrap it up BufferInputStream
, which makes it BufferInputStream
pointless here.
Now, although the buffer size is 4K while reading, this one MyInputStream
only reads 512 bytes at a time from behind GZIPInputStream
. Thus, the number of read calls increases, which increases the latency of file downloads.
The number of system calls while reading from InputStream we could use BufferedInputStream (which reads the available number of bytes in the input stream until the buffer can hold - reference ). In the same way, how could I reduce the number of calls read in a similar BufferedInputStream
way when I use GZIPInputStream
?
Any suggestions are greatly appreciated! Thank you in advance: -)
source to share
No one has answered this question yet
See similar questions:
or similar: