Подтвердить что ты не робот

Возврат каретки\Линейный канал в Java

Я создал текстовый файл в среде 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();
}
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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

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

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

Ответ 6

Инкапсулируйте своего автора, чтобы обеспечить замену 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();
    }

}