Возврат каретки \ Перевод строки в Java - PullRequest
50 голосов
/ 14 мая 2010

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

Для записи текстового файла я использую java.io.FileWriter и BufferedWriter. И для перехода на новую строку после каждой строки я использую метод 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 ]

59 голосов
/ 14 мая 2010

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

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

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

7 голосов
/ 14 мая 2010

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

4 голосов
/ 14 мая 2010

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

2 голосов
/ 14 мая 2010

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

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

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

b) предоставить два файла вложений, один в формате linux, а другой в формате windows.

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

2 голосов
/ 14 мая 2010

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

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

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

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

0 голосов
/ 11 сентября 2017

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

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();
    }

}
...