2

データを読み書きするサーブレットがあります。ここに私のコードのスニペットがあります

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    SPSSFile file = null;
    try {
        File f = new File(getServerDiretory() + "dabadeba_2011.01.03.sav");

        if (!f.exists()) {
            System.out.println("not found");
            return;
        }
        file = new SPSSFile(f);

        file.loadMetadata();
        file.loadData();

        if (file == null) {
            System.err.println("vai");
            return;
        }

        Document doc = file.getDDI2();

        //set up a transformer
        TransformerFactory transfac = TransformerFactory.newInstance();
        Transformer trans = transfac.newTransformer();
        trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
        trans.setOutputProperty(OutputKeys.INDENT, "yes");
        trans.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "yes");

        StringWriter sw = new StringWriter();
        StreamResult result = new StreamResult(sw);
        DOMSource source = new DOMSource(doc);
        trans.transform(source, result);
        String xmlString = sw.toString();

        writeToFile(xmlString);

        out.println(xmlString);

    } catch (TransformerException ex) {
        Logger.getLogger(SPSSReaderServlet.class.getName()).log(Level.SEVERE, null, ex);
    } catch (FileNotFoundException ex) {
        Logger.getLogger(SPSSReaderServlet.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SPSSFileException ex) {
        Logger.getLogger(SPSSReaderServlet.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        out.close();
        if (file != null) {
            file.close();
            System.out.println("done, file closed");
        }
    }
}

JSPを更新してこのサーブレットを再度呼び出すまで、すべてが機能しているようです。ページを更新した後に表示されるエラーは次のとおりです。

SEVERE: org.opendatafoundation.data.spss.SPSSFileException: Error reading data: unexpected compression code for string variable
    at org.opendatafoundation.data.spss.SPSSDataRecord.read(SPSSDataRecord.java:161)
    at org.opendatafoundation.data.spss.SPSSDataRecord.read(SPSSDataRecord.java:54)
    at org.opendatafoundation.data.spss.SPSSFile.loadData(SPSSFile.java:1277)
    at ge.geostat.metadata.web.servlet.SPSSReaderServlet.processRequest(SPSSReaderServl‌​et.java:63)
    at ge.geostat.metadata.web.servlet.SPSSReaderServlet.doGet(SPSSReaderServlet.java:1‌​40)

アプリケーションを再デプロイして実行すると、正常に動作します。私はそれがメモリの問題だと思います、どんな助けも大歓迎です

4

2 に答える 2

1

ページを更新すると例外が発生するため、ファイルを閉じるのを忘れたことが原因で発生します。問題はそれだと確信しています。プロジェクトを初めてビルドするときは機能し、その後は機能しないためです。closeファイルのメソッドをfinallyブロックで呼び出す必要があります。

于 2013-03-28T00:29:25.763 に答える
0

助けてくれてありがとう。私は問題を理解しました.org.opendatafoundation SPSSリーダークラスを使用している人を助けるかもしれません

そのため、問題はメソッド loadData() にあり、2 回目の呼び出しでリセットする必要がある静的変数を使用します: SPSSDataRecord.clusterIndex = 8;

    /**
 * Load the data section of the file into the variables in memory. This may be expensive on memory, use with care on large datasets
 *
 * @throws SPSSFileException
 * @throws IOException
 */
public void loadData() throws IOException, SPSSFileException {
    if (dataStartPosition < 1) {
        // this has not been initialized, we don't actually know where the data starts
        throw new SPSSFileException("Error: data location pointer not initialized.");

    }
    SPSSDataRecord data = new SPSSDataRecord();

    SPSSDataRecord.clusterIndex = 8; //---This is the fix!!!
    seek(dataStartPosition);
    for (int i = 0; i < infoRecord.numberOfCases; i++) {
        // log("\nRECORD "+(i+1)+" offset "+this.getFilePointer());
        data.read(this);
    }
    isDataLoaded = true;
}
于 2013-03-29T11:30:22.393 に答える