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();
}
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.
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ę.
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.
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.
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ż:)
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();
}
}
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