Загрузите объект и сохраните его в виде читабельного текстового файла - PullRequest
0 голосов
/ 24 августа 2018

В настоящее время я пытаюсь разрешить пользователям заполнять форму, представляющую объект, и сохранять ее в виде удобочитаемого текстового файла. Я использую файл filefacesDownload для достижения этой цели.

Мой код работает настолько, что я могу загрузить объект в виде текстового файла, а также загрузить его снова без проблем. К сожалению, это не читается человеком.

Пока я создаю байтовый массив в формате ASCII, который читается человеком, преобразование его в «text / plain» делает его нечитаемым (что я нахожу странным для начала).

  • Как бы я достиг того, что мне нужно?
  • Также, если возможно, мне нужно немного отредактировать файл, прежде чем я наконец сохраню его (например, мне нужно показать почтовые адреса, содержащиеся в 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 голосов
/ 30 августа 2018

Я обновил свой код, чтобы теперь он создавал читабельный JSON.Вам нужен JSON-просмотрщик, чтобы прочитать его.Блокнот ++ отлично работает.Если вы используете «настоящий» 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;
}
...