Java 流csv文件下载立即无需等待

Java 流csv文件下载立即无需等待,java,streaming,outputstream,Java,Streaming,Outputstream,我有RESTAPI,它调用一个方法来检索CSV,因为CSV可以是数百万行,我一次检索50k行,我希望在收到第一个查询结果后立即开始下载,然后继续写入同一个文件 我已经编写了以下代码,但文件下载仍然只有在检索到所有结果后才开始 @GET @Path("network/all/stats/csv/download") @Produces({"text/csv"}) public Response downloadCSV(UIAffiliateRequest uiInstall

我有RESTAPI,它调用一个方法来检索CSV,因为CSV可以是数百万行,我一次检索50k行,我希望在收到第一个查询结果后立即开始下载,然后继续写入同一个文件

我已经编写了以下代码,但文件下载仍然只有在检索到所有结果后才开始

@GET
    @Path("network/all/stats/csv/download")
    @Produces({"text/csv"})
    public Response downloadCSV(UIAffiliateRequest uiInstallsRequest) {StreamingOutput stream = new StreamingOutput() {
                @Override
                public void write(OutputStream os) throws IOException, WebApplicationException {
                    Writer writer = new BufferedWriter(new OutputStreamWriter(os));
                    int off=0;
                    try {
                        CSVResponseType rs;

                        do {
                            rs = installsDao.getCSVResult(uiInstallsRequest, off);
                            String lines[] = rs.getFileName().split("\\r?\\n");
                            for (String path : lines) {
                                writer.write(path.toString() + "\n");
                            }
                            writer.flush();
                            off+=50000;
                        }
                        while (rs.isEmpty());
                    }
                    catch (DaoException e) {
                        ResponseUtils.getDataAccessErrorResponse(e);
                    }
                }
            };

            return Response.ok(stream).header("Content-Disposition", "attachment;filename=resp.csv").build();

    }

我认为您的问题可能出在installsDao.getCSVResult()调用中,这个调用似乎被阻塞了。如果您注意到paths变量是在StreamingOutput实现之外完全处理的,那么我将与本文的代码进行比较。您需要为CSV结果的分页找到一个更好的算法,可能将查询移出并从中返回一个流,而不是分页,但我不确定这是否有帮助。