我正在尝试生成一个.csv
文件作为对一个休息的网络服务的响应(使用泽西岛(。到目前为止,我能够得到一个List<HashMap<String, String>>
,键应该是CSV标头,值应该是CSV数据。
我正在使用杰克逊API进行CSV生成。
代码流为:
-
我从 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(); }
-
现在,正在给定位置的
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
类进行编码。编码后,只需将编码的字节写入StreamingOutput
OutputStream
即可。下面是一个示例。
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();
}
};