Как обернуть 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?

Любые предложения приветствуются! Заранее спасибо:-)

0 ответов

Другие вопросы по тегам