Eclipse CSV Download切断数据

时间:2016-04-14 17:47:07

标签: java eclipse csv jdbc

我目前在我的java类中有一个文件下载过程,如下所示,用于获取SQL表中的所有数据并将其放在CSV文件中供用户下载。但是,当我下载文件时,所有数据都很好,除非它会在随机点切断(通常在数据的第20行附近,因为至少有超过100行数据)。我想问一下,如果做截止点怎么办?是会话时间相关还是代码有问题?

    public String processFileDownload() {

    DataBaseBean ckear = new DataBaseBean();
    ckear.clearContens();
    FacesContext fc = FacesContext.getCurrentInstance();
    ExternalContext ec = fc.getExternalContext();
    Map<String, Object> m = fc.getExternalContext().getSessionMap();
    dbase = (DbaseBean) m.get("dbaseBean");
    message = (MessageBean) m.get("messageBean");
    dataBean = (DataBean) m.get("dataBean");
    dbmsUser = (DbmsUserBean) m.get("dbmsUserBean");
    FileOutputStream fos = null;

    String path = fc.getExternalContext().getRealPath("/temp");
    String tableName = dbmsUser.getTableName();
    String fileNameBase = tableName + ".csv";
    java.net.URL check = getClass().getClassLoader().getResource(
            "config.properties");
    File check2 = new File(check.getPath());
    path = check2.getParent();
    String fileName = path + "/" + dbmsUser.getUserName() + "_"
            + fileNameBase;

    File f = new File(fileName);
    try {
        f.createNewFile();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    dbase.connect();
    dbase.setQueryType("SELECT");
    dbase.executeSQL("select * from " + tableName);
    if (dbase.getResultSet() == null) {
        FacesContext.getCurrentInstance().addMessage("myForm3:errmess",
                new FacesMessage("Table doesn't exist!"));
        return "failed";
    }
    Result result = ResultSupport.toResult(dbase.getResultSet());
    downlaodedrows = result.getRowCount();
    Object[][] sData = result.getRowsByIndex();
    String columnNames[] = result.getColumnNames();
    StringBuffer sb = new StringBuffer();
    try {
        fos = new FileOutputStream(fileName);

        for (int i = 0; i < columnNames.length; i++) {
            sb.append(columnNames[i].toString() + ",");
        }

        sb.append("\n");

        fos.write(sb.toString().getBytes());

        for (int i = 0; i < sData.length; i++) {
            sb = new StringBuffer();
            for (int j = 0; j < sData[0].length; j++) {
                sb.append(sData[i][j].toString() + ",");
            }

            sb.append("\n");
            fos.write(sb.toString().getBytes());
        }

        fos.flush();
        fos.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 

    String mimeType = ec.getMimeType(fileName);
    FileInputStream in = null;
    byte b;

    ec.responseReset();
    ec.setResponseContentType(mimeType);
    ec.setResponseContentLength((int) f.length());
    ec.setResponseHeader("Content-Disposition", "attachment; filename=\""
            + fileNameBase + "\"");

    try {
        in = new FileInputStream(f);
        OutputStream output = ec.getResponseOutputStream();
        while (true) {
            b = (byte) in.read();
            if (b < 0)
                break;
            output.write(b);
        }
    } catch (NullPointerException e) {
        fc.responseComplete();
        return "SUCCESS";
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        try {
            in.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    fc.responseComplete();
    return "SUCCESS";

}

1 个答案:

答案 0 :(得分:0)

问题似乎在于您只是在值之间添加逗号,并且您正在编写的值中的一个可能包含分隔符,行分隔符或引号字符,这将导致&#34;破坏&#34;如果没有正确转义,则为CSV格式。

使用CSV库会更简单,更快捷。 uniVocity-parsers附带预先构建的例程,可将结果集转储为格式正确的CSV。在您的情况下,您可以通过以下方式使用此库:

    ResultSet resultSet = dbase.getResultSet();

    // Configure the output format as needed before actually dumping the data:
    CsvWriterSettings writerSettings = new CsvWriterSettings(); //many settings here, check the tutorials & examples.
    writerSettings.getFormat().setLineSeparator("\n");
    writerSettings.setHeaderWritingEnabled(true); // we want the column names to be printed out as well.

    // Then create a routines object:
    CsvRoutines routines = new CsvRoutines(writerSettings);

    // The write() method takes care of everything. The resultSet and any other resources required are closed by the routine.
    routines.write(resultSet, new File(fileName), "UTF-8");

希望这有帮助

免责声明:我是这个图书馆的作者。它的开源和免费(Apache 2.0。许可证)