Carriage ReturnLine feed in Java

Stworzyłem plik tekstowy w środowisku Unix przy użyciu kodu Javy.

Do zapisu pliku tekstowego używam java.io.FileWriter i BufferedWriter. A dla nowej linii po każdym wierszu używam metody bw.newLine() (Gdzie bw jest obiektem BufferedWriter).

I wysyłam ten plik tekstowy poprzez dołączenie w mailu z samego środowiska Unix (automatycznie przy użyciu komend uniksowych).

Mój problem polega na tym, że po pobraniu pliku tekstowego z poczty w systemie Windows, jeśli otworzył ten plik tekstowy dane nie są prawidłowo / align = "left" / newline() znak jest chyba nie działa.

Chcę takie samo wyrównanie plików tekstowych jak w środowisku Unix, jeśli otworzyłem plik tekstowy również w środowisku Windows.

Jak rozwiązać problem?

Poniższy kod Javy (działający w środowisku 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();
}
Author: ADTC, 2010-05-14

6 answers

Java wie tylko o platformie, na której jest obecnie uruchomiona, więc może dać tylko zależne od platformy wyjście na tej platformie (używając bw.newLine()). Fakt, że otwierasz go w systemie windows oznacza, że albo musisz przekonwertować plik przed jego użyciem (używając czegoś, co napisałeś, albo używając programu typu unix2dos), albo musisz wypisać plik w formacie windows, który powraca w nim pierwotnie w programie Java. Więc jeśli wiesz, że plik będzie zawsze otwarty na komputerze z systemem windows będziesz musiał wyjść

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

Warto zauważyć, że nie będziesz w stanie wydrukować pliku, który będzie wyglądał poprawnie na obu platformach, jeśli jest to zwykły tekst, którego używasz, możesz rozważyć użycie html, jeśli jest to e-mail, lub xml, jeśli jest to dane. Alternatywnie może być potrzebny jakiś klient, który odczytuje dane, a następnie formatuje je dla platformy, z której korzysta przeglądarka.

 58
Author: James B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-12 12:09:17

Metoda newLine() zapewnia dodanie nowej linii kompatybilnej z platformą ({[1] } Dla DOS, 0Dh dla starszych komputerów Mac, 0Ah Dla Unix/Linux). Java nie ma możliwości poznania na jakiej platformie zamierzasz wysłać tekst. Taką konwersją powinny zająć się podmioty wysyłające pocztę.

 6
Author: nc3b,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-14 08:30:03

Nie wiem, kto patrzy na Twój plik, ale jeśli otworzysz go w programie WordPad zamiast notatnika, linie będą wyświetlane poprawnie. Jeśli używasz specjalnego rozszerzenia pliku, skojarzyć go z wordpad i gotowe z nim. Lub użyć innego bardziej zaawansowanego edytora tekstu.

 3
Author: Axel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-14 13:55:22

bw.newLine(); nie można zapewnić kompatybilności ze wszystkimi systemami.

Jeśli jesteś pewien, że zostanie otwarty w systemie windows, możesz sformatować go na nową linię windows.

Jeśli używasz już natywnych poleceń Uniksa, spróbuj unix2dos i przekonwertuj już wygenerowany plik do formatu windows, a następnie Wyślij pocztę.

Jeśli nie używasz komend uniksowych, a wolisz robić to w Javie, użyj `bw.write ("\R\n")` i jeśli to nie komplikuje Twojego programu, miej metodę, która wykryje działanie system i zapisuje odpowiedni znak nowej linii.

 2
Author: Vaishak Suresh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-14 08:52:32

Jeśli dobrze cię rozumiem, mówimy o załączniku do pliku tekstowego. To niefortunne, ponieważ gdyby to była treść wiadomości e-mail, zawsze możesz użyć "\R \ n", odnosząc się do http://www.faqs.org/rfcs/rfc822.html

Ale ponieważ jest to załącznik, musisz żyć z różnicami systemowymi. Gdybym był na Twoim miejscu, wybrałbym jedną z tych opcji:

A) obsługuje tylko klientów windows, używając "\R \ n"jako końca linii.

B) podaj dwa pliki załączników, jeden z Linuksem format i jeden z formatem windows.

C) Nie wiem, czy załącznik ma być czytany przez ludzi lub maszyny, ale jeśli są to ludzie, rozważyłbym dołączenie pliku HTML zamiast zwykłego tekstu. bardziej przenośne i dużo ładniejsze, też:)

 2
Author: rompetroll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-14 09:16:56

Enkapsuluj swój writer, Aby zapewnić zastąpienie znaków, w następujący sposób:

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

}
 0
Author: The Felis Leo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-11 12:23:16