Возврат кареткиподача строки в Java

Я создал текстовый файл в среде Unix с использованием кода Java.

для написания текстового файла, я использую java.io.FileWriter и BufferedWriter. И для newline после каждой строки я использую bw.newLine() способ (где bw является объектом BufferedWriter).

и я отправляю этот текстовый файл, прикрепляя его по почте из самой среды Unix (автоматизированной с использованием команд Unix).

моя проблема в том, что после загрузки текстового файла из почты в системе Windows, если я открыл текстовый файл данные неправильно выровнены. newline() персонаж не работает, я так думаю.

Я хочу такое же выравнивание текстового файла, как и в среде Unix, если я открыл текстовый файл в среде Windows также.

как решить проблему?

код Java ниже для вашей справки (работает в среде Unix):

File f = new File(strFileGenLoc);
BufferedWriter bw = new BufferedWriter(new FileWriter(f, false));
rs = stmt.executeQuery("select * from jpdata");
while ( rs.next() ) {
    bw.write(rs.getString(1)==null? "":rs.getString(1));
    bw.newLine();
}

6 ответов


Java знает только о платформе, на которой она в настоящее время работает, поэтому она может дать вам только зависящий от платформы вывод на этой платформе (используя bw.newLine()) . Тот факт, что вы открываете его в системе windows, означает, что вам нужно либо конвертировать файл перед его использованием (используя что-то написанное, либо используя такую программу, как unix2dos), или вы должны вывести файл с кареткой формата windows возвращает в нем первоначально в вашей программе Java. Поэтому, если вы знаете, что файл будет всегда открывайтесь на машине windows, вам нужно будет вывести

bw.write(rs.getString(1)==null? "":rs.getString(1));
bw.write("\r\n");

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


метод newLine() обеспечивает добавление новой строки, совместимой с платформой (0Dh 0Ah для DOS, 0Dh для старых Макинтошей, 0Ah для Unix / Linux). Java не может знать, на какой платформе вы собираетесь отправлять текст. Об этом преобразовании должны позаботиться отправляющие почту субъекты.


Не знаю, кто смотрит на ваш файл, но если вы откроете его в wordpad вместо блокнота, linebreaks покажет правильно. Если вы используете специальное расширение файла, свяжите его с wordpad, и все готово. Или используйте любой другой более продвинутый текстовый редактор.


bw.newLine(); невозможно обеспечить совместимость со всеми системами.

Если вы уверены, что он будет открыт в windows, вы можете отформатировать его в Windows newline.

Если вы уже используете собственные команды unix, попробуйте unix2dos и конвертировать уже сгенерированный файл в формат windows, а затем отправить письмо.

Если вы не используете команды unix и предпочитаете делать это на java, используйте `bw.write ("\r\n")` и если это не усложняет вашу программу, есть метод, который находит операционную систему и пишет соответствующую новую строку.


Если я правильно вас понимаю, мы говорим о вложении текстового файла. К сожалению, если это было тело сообщения электронной почты, вы всегда можете использовать "\r\n", ссылаясь наhttp://www.faqs.org/rfcs/rfc822.html

но поскольку это приложение, вы должны жить с системными различиями. Если бы я был на вашем месте, я бы выбрал один из этих вариантов:

a) поддерживает только клиенты windows, используя "\r\n " в качестве конца строки.

b) обеспечьте 2 приложения файлы, один с форматом linux и один с форматом windows.

c) я не знаю, должно ли приложение быть прочитано людьми или машинами, но если это люди, я бы рассмотрел возможность прикрепления HTML-файла вместо обычного текста. более портативный и гораздо красивее, тоже :)


Инкапсулируйте свой писатель, чтобы обеспечить замену char, например:

public class WindowsFileWriter extends Writer {

    private Writer writer;

    public WindowsFileWriter(File file) throws IOException {
        try {
            writer = new OutputStreamWriter(new FileOutputStream(file), "ISO-8859-15");
        } catch (UnsupportedEncodingException e) {
            writer = new FileWriter(logfile);
        }
    }

    @Override
    public void write(char[] cbuf, int off, int len) throws IOException {
        writer.write(new String(cbuf, off, len).replace("\n", "\r\n"));
    }

    @Override
    public void flush() throws IOException {
        writer.flush();
    }

    @Override
    public void close() throws IOException {
        writer.close();
    }

}