Другой результат при записи в WordPad, чем при записи в блокнот с использованием того же кода

В настоящее время я работаю над генератором столкновений для игры с пером и бумагой, известной как D&D(Подземелья и драконы). У меня есть архив монстров, записанных в файлах блокнота. Когда пользователь заканчивает использовать фильтры, которые он хочет, и нажимает "генерировать", программа фильтрует монстров, читает файл блокнота с указанными монстрами и записывает его (их) в новый файл блокнота, который затем открывается (используя исполняемый exec). Все это работало как задумано, когда я читал и писал из блокнота в блокнот. Затем я получил несколько отзывов от моих тестеров о том, что им понравятся некоторые картинки, а также другое форматирование текста. Поэтому я изменил архивные файлы на RTF (word pad / rich text file), а также изменил готовый файл на тот же формат. Моя проблема сейчас в том, что программа записывает в файл только одного монстра, даже если предполагается, что он записывает два или более.

Вот код для метода чтения и записи

public void readerAndWriter()throws IOException
{
    destination = "Encounter.rtf";
    File EncounterFile = new File(source);
    FileInputStream fis =new FileInputStream(EncounterFile);
    BufferedReader in = new BufferedReader(new InputStreamReader(fis));

    FileWriter writer = new FileWriter(destination,true);
    BufferedWriter out = new BufferedWriter(writer);

    String aLine = null;
    while((aLine = in.readLine())!= null)
    {
        out.write(aLine);
        out.newLine();
    }
    in.close();
    out.close();
}

Вот фрагмент кода для метода, который использует метод чтения и записи

if (monsters.get(t).getRace() == monsters.get(u).getRace())
{
             if (monsters.get(t).getCr() + monsters.get(u).getCr() ==  
                 getChosenCr())
                {

                      readAndWrite.setSource(monsters.get(t).getFilePath());
                      readAndWrite.readerAndWriter();
                      readAndWrite.setSource(monsters.get(u).getFilePath());
                      readAndWrite.readerAndWriter();

                        correctMonster = true;
                 }
else
   etc etc

все советы и подсказки приветствуются.

1 ответ

Если я правильно понимаю ваш код, вы просто добавляете содержимое нескольких файлов друг к другу (ваши файлы монстров). Вы можете сделать это с текстовыми файлами, но RTF не так прост (я предполагаю, что вы видите только первого монстра, потому что RTF игнорирует следующие документы RTF, явно прикрепленные к содержимому RTF). Вместо этого вы должны

  1. Создать Document экземпляр для вашего файла назначения.
  2. Прочитайте желаемый контент из ваших исходных файлов в javax.swing.text.Documents.
  3. Вставьте содержимое из исходных документов в целевой документ, используя соответствующий API.
  4. Запишите целевой документ в новый файл.

Как прокомментировал ControlAltDel, вы можете использовать RTFEditorKit для этого (пример кода, немного адаптированный из примера 5 http://www.programcreek.com/java-api-examples/index.php?api=javax.swing.text.rtf.RTFEditorKit):

/**
 * Reads the file specified by path and writes its text content to out.
 * @param out Writer to output the text content
 * @param path name of an RTF file to read from
 */
public void simpleRtfExample(Writer out, String path) throws IOException {
    FileInputStream in = null;
    try {
        in = new FileInputStream(path);
        byte[] buffer = new byte[in.available()];
        in.read(buffer, 0, in.available());
        String input = new String(buffer);
        String result = null;
        try {
            RTFEditorKit rtfEditor = new RTFEditorKit();
            Document doc = rtfEditor.createDefaultDocument();

            // read the source RTF into doc:
            rtfEditor.read(new StringReader(input), doc, 0);

            // Get the text of the document as String.
            // Here you could use doc's API to access
            // its content in a more sophisticated manner.
            result = doc.getText(0,doc.getLength());
        } catch (Exception e) {
            e.printStackTrace();
        }
        out.write(result);
    } finally {
        IOUtils.closeQuietly(in);
    }
}
Другие вопросы по тегам