使用泽西休息网络服务生成.csv文件



我正在尝试生成一个.csv文件作为对一个休息的网络服务的响应(使用泽西岛(。到目前为止,我能够得到一个List<HashMap<String, String>>,键应该是CSV标头,值应该是CSV数据。

我正在使用杰克逊API进行CSV生成。
代码流为:

  1. 我从 DAO 类获取数据List<HashMap<String, String>>列表的名称是myArrList.
    我的第一个疑问是在真实场景中提供这样的文件位置是个好主意吗?我还能怎么做?如何在不在本地系统中实际创建文件的情况下发送包含数据的文件?

    File file = new File( "C:/Users/.../Downloads/RadioObjectData.csv");
    Writer writer = null;
    ResponseBuilder response = null;
    Reader reader = null;
    //Copy List of Map Object into CSV format at specified File location.
    try
    {
    writer = new FileWriter( file, false);
    reader = new FileReader( file);
    csvWriter( myArrList, writer);
    // csvReader( reader);
    response = Response.ok( (Object)file);
    response.header( "Content-Disposition", "attachment; filename="RadioObjectData.csv"");
    // return response.build();
    }
    catch (IOException e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    //Read CSV format from specified File location and print on console..
    return response.build();
    

    现在我将此List发送到csvWriter方法以在我的系统中创建一个.csv文件,以便我可以发送相同的文件作为对 Web 服务的响应。(这种方法可以吗?

    public static void csvWriter( List<HashMap<String, String>> listOfMap, Writer writer) throws IOException
    {
    CsvSchema schema = null;
    CsvSchema.Builder schemaBuilder = CsvSchema.builder();
    if (listOfMap != null && !listOfMap.isEmpty())
    {
    for (String col: listOfMap.get( 0).keySet())
    {
    schemaBuilder.addColumn( col);
    }
    schema = schemaBuilder.build().withLineSeparator( "r").withHeader();
    }
    CsvMapper mapper = new CsvMapper();
    mapper.writer( schema).writeValues( writer).writeAll( listOfMap);
    writer.flush();
    }
    
  2. 现在,正在给定位置的C驱动器中创建.csv文件。
    我希望在将此 CSV 作为响应发送之前以base64编码。

我怎样才能实现这一切?

只需使用StreamingOutput作为Response实体。

interface StreamingOutput {
void write(OutputStream out);
}

您只需实现此接口并将其传递给Response.ok()方法。在这种情况下,您要做的只是将OutputStream包装在OutputStreamWriter中,以便您可以将其传递给CsvMapper.writeValues(Writer)方法。

StreamingOutput entity = new StreamingOutput() {
@Override
public void write(OutputStream out) {
Writer writer = new BufferedWriter(
new OutputStreamWriter(out, StandardCharsets.UTF_8));
csvWriter(myArrList, writer);
out.flush();
}
};
return Response.ok(entity)
.header(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename="RadioObjectData.csv"")
.build();

这就是您所需要的。无需任何中间存储。

更新

如果要对 CSV 文件进行 Base64 编码,可以做的是写入ByteArrayOutputStream并使用这些字节与Base64类进行编码。编码后,只需将编码的字节写入StreamingOutputOutputStream即可。下面是一个示例。

StreamingOutput entity = new StreamingOutput() {
@Override
public void write(OutputStream out) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedWriter baosWriter = new BufferedWriter(
new OutputStreamWriter(baos, StandardCharsets.UTF_8));
csvWriter(myArrList, baosWriter);
byte[] bytes = baos.toByteArray();
byte[] base64Encoded = Base64.getEncoder().encode(bytes);
out.write(base64Encoded);
out.flush();
}
};

最新更新