java - Eclipse CSV下载截断数据

标签 java eclipse csv jdbc

目前,我的 java 类中有一个文件下载过程(如下所示),用于获取 SQL 表中的所有数据并将其放入 CSV 文件中以供用户下载。但是,当我下载该文件时,所有数据都很好,只是会在随机点处中断(通常在数据的第 20 行左右,因为至少有 100 多行数据)。我想问一下,如果断掉怎么办?是 session 时间相关还是代码有问题?

    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";

}

最佳答案

问题似乎是您只是在值之间附加逗号,并且您正在编写的值之一可能包含分隔符、行分隔符或引号字符,如果未正确转义,这将“破坏”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.许可证)

关于java - Eclipse CSV下载截断数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36630390/

相关文章:

java - Android 中的重写 onResume 方法不适用于每个 fragment

java - 如何获取sql server中的当前日期时间?

eclipse - 在 Eclipse 中,我可以在垂直堆栈而不是水平堆栈中查看当前打开的文件吗?

java - Java Swing 的 IDE

xslt - 使用 XSLT 帮助将 XML 转换为 CSV

java - Maven - 无法复制 webapp 源

java - 如何在Java中动态添加charsequence []中的数据?

java - Eclipse 资源管理器中缺少小红色 "x"以及具有编译错误的 Java 源代码问题 View ?

mysql - 使用单个csv文件将多个表数据导入mysql

python - 如何使用 pandas 模块合并(即 'concat' )100+ .csv 文件?