Есть ли способ оптимизировать способ создания файла и вывода его в виде .zip в сервлете Java? - PullRequest
1 голос
/ 02 сентября 2010

У пользователя есть несколько вариантов поиска на странице JSP.После того, как он выбрал, какие данные он хочет экспортировать, JSP вызывает мой сервлет, который должен сделать что-то вроде этого:

  1. получить данные запроса
  2. сгенерировать SQL для данных запроса
  3. выполнить SQL и записать его в файл XML
  4. упаковать файл XML в файл ZIP и вернуть его в качестве ответа

Теперь первые две точки тривиальны, новторые два - это то, в чем я не уверен:

 //3. execute the SQL and write it to a XML file
    ConnectionManager cm = new ConnectionManager();
    Connection conn = null;
    ResultSet rs = null;
    Statement stmt = null;

    try {
        conn =cm.getConnection();
        stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
        rs = stmt.executeQuery(sqlQuery);
        // generates XML and writes it to a java.io.Writer
        OutputStreamWriter writer = new OutputStreamWriter( new FileOutputStream(Konstante.zipFolder + idVrsteSifarnika+ ".xml"), "UTF8");
        XMLWriter.writeXMLToWriter(rs,writer);
    } catch (Exception ex) {
        logger.error(ex);
    } finally {
        ConnectionManager.close(rs, stmt, conn); 
    }

//4. package the XML file to a ZIP file and return it as a response
    ZipEntry ze = new ZipEntry(idVrsteSifarnika + ".xml");
    BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
    ZipOutputStream zos = new ZipOutputStream(bos);
    zos.putNextEntry(ze);
    FileInputStream fis = new FileInputStream(new File(Konstante.zipFolder + idVrsteSifarnika+ ".xml"));
    final byte[] buffer = new byte[1024];
    int n;
    while ((n = fis.read(buffer)) != -1)
        zos.write(buffer, 0, n);
    zos.closeEntry();
    zos.flush();
    zos.close();
    fis.close();
    bos.close();

Что я хотел бы знать, так это то, можно ли оптимизировать использование памяти / скорость выполнения, изменив способ, которым я делаю все это / меняя различные потоки?

PS Это метод writeXMLToWriter

//Set up XML
    DataWriter w = new DataWriter(writer);
    w.startDocument();
    w.setIndentStep(2);
    w.startElement(startingXMLElement);
    // Get the metadata
    ResultSetMetaData meta = rs.getMetaData();
    int count = meta.getColumnCount();
    // Iterate over the set
    while (rs.next()) {
        w.startElement(rowElement);
        for (int i = 0; i < count; i++) {
            Object ob = rs.getObject(i + 1);
            if (rs.wasNull()) {
                ob = null;
            }
            String colName = meta.getColumnLabel(i + 1);
            if (ob != null ) {
                if (ob instanceof Timestamp) {
                    w.dataElement(colName, Util.formatDate((Timestamp)ob, dateFormat)); 
                }
                else if (ob instanceof BigDecimal){
                    w.dataElement(colName, Util.transformToHTML(new Integer(((BigDecimal)ob).intValue())));
                }
                else {
                    w.dataElement(colName, ob.toString());
                }

            } else {
                w.emptyElement(colName);
            }
        }
        w.endElement(rowElement);
    }
    w.endElement(startingXMLElement);
    w.endDocument();

1 Ответ

4 голосов
/ 02 сентября 2010

Нет необходимости записывать XML на диск вообще.Просто создайте OutputStreamWriter обертку ZipOutputStream и передайте его в writeXMLToWriter метод:

ZipOutputStream zos = new ZipOutputStream(bos);
zos.putNextEntry(ze);
OutputStreamWriter writer = new OutputStreamWriter(zos, "UTF-8");
XMLWriter.writeXMLToWriter(rs,writer);
writer.close();
zos.closeEntry();
zos.flush();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...