Как получить степень сжатия для файла GZipped? - PullRequest
0 голосов
/ 13 апреля 2010

Вот как я сжал данные:

<%@ page import="javax.servlet.jsp.*,java.io.*,java.util.zip.*" %>

<%
String encodings = request.getHeader("Accept-Encoding");
PrintWriter outWriter = null;

if ((encodings != null) && (encodings.indexOf("gzip") != -1)) {
  OutputStream outA = response.getOutputStream();
  outWriter = new PrintWriter(new GZIPOutputStream(outA), false);
  response.setHeader("Content-Encoding", "gzip");
  int a = response.getBufferSize();
  System.out.println("ZIPPED VERSION BF:"+a);
} 
else {
  System.out.println("UN-ZIPPED VERSION");
  outWriter = new PrintWriter(response.getOutputStream(), false);
}

outWriter.println("<HTML><BODY>");

for(int i=0; i<1000; i++) {
  outWriter.println(" blah blah blah<br>");
}

outWriter.println("</BODY></HTML>");
outWriter.close();
%>

Ответы [ 2 ]

2 голосов
/ 13 апреля 2010

Извините за грубость, но такой подход совершенно неверен.Во-первых, вы не хотите делать это в файле JSP по крайней мере по двум причинам: 1) необработанный код Java ( scriptlets ) относится к реальным классам Java и 2) JSP предназначен для символьных данных, а недля двоичных данных это только повредит данные.Во-вторых, любой приличный appserver предоставляет опцию конфигурации, независимо от того, автоматически GZIP ответ или нет.Например, Tomcat 6.0 , вы можете просто расширить элемент <Connector> в /conf/server.xml с атрибутом compression, который установлен в "on":

<Connector ... compression="on" />

Также см. эта статья для получения дополнительных советов относительно производительности веб-приложения.

Возвращаясь к вашему актуальному вопросу: нет настроек для изменения степени сжатия для GZIP.Это также не нужно.

Обновление : Я понял, что вы просили получить , а не установить .Хорошо, используйте HTTP-клиент и рассчитайте длину InputStream.Вот базовый пример начала работы с помощью java.net.URLConnection:

URLConnection connection = new URL("http://localhost/context/page.jsp");
connection.setRequestProperty("Accept-Encoding", "gzip"); // Outcomment this to turn off GZIP.
InputStream input = connection.getInputStream();
ByteArrayOutputStream output = new ByteArrayOutputStream();
for (int data = 0; (data = input.read()) != -1; output.write(data));
System.out.println("Length: " + output.toByteArray().length + " bytes");

Затем просто выполните математику в начальной школе, чтобы получить степень сжатия.Разделяй, умножай и т.д .;)

0 голосов
/ 13 апреля 2010

Если я что-то здесь не упустил, вы просто вручную рассчитаете размер оригинала, разделенный на сжатый размер.

...