下载对象并将其另存为人类可读的文本文件

时间:2018-08-24 17:31:39

标签: java-ee primefaces

我目前正在尝试允许用户填写代表一个对象的表格,并将其保存为人类可读的文本文件。我正在使用primefaces文件下载来实现这一目标。

我的代码在可以将对象下载为文本文件的范围内运行,并且可以再次毫无问题地再次上传。不幸的是,这不是人类可读的。

虽然我正在创建人类可读的ASCII格式的字节数组,但将其转换为“文本/纯文本”会使它变得不可读(我觉得很奇怪)。

  • 我将如何实现我所需要的?
  • 此外,如果可能的话,我需要在最终保存文件之前对其进行一些编辑(例如,我需要将dataObject中包含的邮​​件地址显示为列表->每行1个邮件)

JSF

 <p:commandButton value="#{resPage['button.export']}"
                  ajax="false" 
                  onclick="PrimeFaces.monitorDownload(start, stop);" 
                  icon="ui-icon-arrowthick-1-s"
                  title="#{resPage['button.export.tooltip']}">
                      <p:fileDownload value="#{distributionListEditor.export}" />
 </p:commandButton>

Java

/** 
 * Export the distribution list to a text file.
 */
public StreamedContent getExport() {

    String fileName= "Distribution_List.txt";
    DistributionListBean data = getObject();

    if(data == null) {

    data.setMembers(ItemUtil.convertFromItemList(recipients));
    data.setParameters(ItemUtil.convertFromItemList(parameters));

    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(data);
        oos.flush();
        oos.close();

        byte[] ascii = baos.toByteArray(); 

        InputStream stream = new ByteArrayInputStream(ascii);
        DefaultStreamedContent dsc = new DefaultStreamedContent(stream, "text/plain", fileName);

        return dsc;
    } catch(Exception ex) {
      LOGGER.error(ex);
    }
    return null;
}

1 个答案:

答案 0 :(得分:0)

我已经更新了我的代码,现在它可以生成人类可读的JSON。您需要一个JSON查看器才能读取它。 Notepad ++可以正常工作。如果您使用“真实的” JSON查看器,那么您甚至可以以优雅的方式对行进行格式化。 感谢@kukeltje提供正确答案,并指出我的编辑错误。感谢@melloware建议使用“ GSON”,这非常容易。

JSF

 <p:commandButton value="#{resPage['button.export']}"
                  ajax="false" 
                  onclick="PrimeFaces.monitorDownload(start, stop);" 
                  icon="ui-icon-arrowthick-1-s"
                  title="#{resPage['button.export.tooltip']}">
                      <p:fileDownload value="#{distributionListEditor.export}" />
 </p:commandButton>

Java

/** 
 * Export the distribution list to a text file.
 */
public StreamedContent getExport() {

    String fileName= "Distribution_List.txt";
    DistributionListBean data = getObject();

    Gson gson = new Gson();
    String dataString = gson.toJson(data);

    try {
        InputStream stream = new ByteArrayInputStream(dataString.getBytes());
        DefaultStreamedContent dsc = new DefaultStreamedContent(stream, "text/plain", fileName, "US-ASCII");

        return dsc;
    } 
    } catch(Exception ex) {
      LOGGER.error(ex);
    }
    return null;
}