Как обернуть GZipInputStream с BufferedInputStream?
У меня есть FileReadClient
который читает файл следующим образом,
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;
}
Вот мой FileDownloadServlet
который читает содержимое файла и записывает его в ServletOutputStream
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);
}
Я храню свой файл как сжатый, поэтому при чтении исходного файла мой файл распаковывается GZIPInputStream
который в FileReadClient
Случай 1:
Все, что я мог видеть, это мой read()
позвонить FileReadClient
читает 8192
байт полностью и мой FileDownloadServlet
читает 4096
байт в два раза. Я не мог понять, как это выглядит 8192
байт изначально, хотя я дал длину буфера как 4096
пока read() вызов.
Случай 2:
Сейчас я читаю файл в сжатом формате из FileReadClient
и передать его в мой входной поток
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
}
}
}
Теперь, когда я читаю содержимое моего файла из FileDownloadServlet
с MyInputStream
Я мог прочитать только 512 байт данных - хотя я обернул его BufferInputStream
- что делает BufferInputStream
бессмысленно здесь.
Теперь, хотя размер буфера 4K во время чтения этого MyInputStream
читает только 512 байт за раз из-за GZIPInputStream
, Таким образом, увеличивается количество вызовов чтения, что увеличивает задержку загрузки файла.
Количество системных вызовов во время чтения из InputStream мы могли бы использовать BufferedInputStream (который считывает доступное количество байтов во входном потоке до тех пор, пока буфер не сможет удерживать - ссылка). Точно так же, как я мог бы уменьшить количество вызовов чтения аналогично BufferedInputStream
когда я использую GZIPInputStream
?
Любые предложения приветствуются! Заранее спасибо:-)