Zapis JTextArea do pliku

Zapis JTextArea do pliku
KI
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:23
0

Witam
Chce zapisać dane z pola tekstowego ale gdy odczytuje plik w notatniku to dane sa zapisane bez znaku nowego wiersza to znaczy

w polu mam dane
1
2
3

to w pliku zapisane 123
Jak zrobić aby było poprawnie?
Oto metoda

Kopiuj
 private void SaveFile(){
		try {
			FileWriter g = new FileWriter(place);
			PrintWriter out = new PrintWriter(g,true);
                        out.println(text.getText());
			out.close();
		} catch (IOException e) {}
				
	}
private JTextArea text;
private String place; // sciezka z nazwa do pliku


dziękuje za pomoc i pozdrawiam
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Są dwa sposoby:

  1. nie używaj notatnika, który jest niepoprawny,
  2. podziel tekst na linie i zapisuj każdą linie osobno dodając na końcu "\r\n".

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
Olamagato
2. Powinien raczej używać metody System.lineSeparator(), która jest przenośna. Ewentualnie printf ze znacznikiem %n, który daje to samo.
bogdans
Nie rozumiem, jakie znaczenie w tym przypadku ma przenośność? Używając lineSeparator() zapiszesz plik tak, że będzie poprawnie odczytywany na tym samy SO, na innych już nie. Skoro autor otwiera plik notatnikiem, to korzysta z windows.
Olamagato
Chodzi o to, że jeżeli do kodu wbije na sztywno \r\n, to ten kod będzie mu działał bez rekompilacji tylko pod Windows. A wcale nie wiadomo czy to jest intencją autora. Poza tym można napisać kod, który będzie wczytywać plik tekstowy zawsze poprawnie. Np. wyszukując występowanie \r i \n w pliku txt: Jeżeli nie występuje \r, to separatorem jest \n (unix), jeżeli nie występuje \n to separatorem jest \r (Mac), a jeżeli żadne z powyższych, to separatorem jest \r\n (Windows). Lepiej jest pisać przenośnie, jeżeli ma się wybór. Pozdrawiam.
bogdans
Nie zgadzam się, kod z wbitym \r\n będzie działał w każdym systemie. Przenośność, moim zdaniem, wymaga by używać na końcu wiersza właśnie separatora windowsowego \r\n. Wszystkie znane mi edytory (poza notatnikiem) "wiedzą", że stosowane są trzy rodzaje separatora i wyświetlają plik poprawnie. Można powiedzieć, że przenośność wymaga dostosowania się do notatnika. Pozdrawiam.
KI
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:23
0

jak podzielić tekst na linie z JTextArea ?

tomasz79
  • Rejestracja:około 15 lat
  • Ostatnio:ponad rok
  • Postów:52
0

Hej.
To jest moja recepta na zapisywanie linia po linii.

Kopiuj
     /**
     * Metoda do zapisania tekstu linia po linii
     * raport_txt - to jest JTextArea
     */
    public void exportTxt() {
        JFileChooser zapiszOkno = new JFileChooser();
        FileNameExtensionFilter zapiszFiltr = new FileNameExtensionFilter("Pliki tekstowe *.txt", "txt");
        zapiszOkno.setFileFilter(zapiszFiltr);
        int wynik_zapisz = zapiszOkno.showSaveDialog(raport);
        File zapiszFile = zapiszOkno.getSelectedFile();
//      Sprawdzenie czy właczone jest zawijanie wierszy bo jeśli tak to trzeba to wyłączyć
        boolean stanZawijania = raport_txt.getLineWrap();
        raport_txt.setLineWrap(false);//brak zawjania  
        String tekst = raport_txt.getText();
//      przechwytywanie wyjątku i zapis danych
        String adresZapisz1 = String.valueOf(zapiszFile).replace(".txt", "");
        if (wynik_zapisz != 0) {
            JOptionPane.showMessageDialog(null, "Nie podano / wskazano nazwy pliku.\nPrzerwano działanie funkcji Export...", "Export do 'Notatnik' format *.txt", 2);

        } else {
            int ile_wierszy = raport_txt.getLineCount();// odczyt ilości wierszy
//      zapis danych do pliku
            try {
                BufferedWriter zapisDane = new BufferedWriter(new FileWriter(adresZapisz1 + ".txt"));
                for (int i = 0; i < ile_wierszy; i++) {
                    int dd2 = raport_txt.getLineStartOffset(i);
                    int dd3 = raport_txt.getLineEndOffset(i);
                    String odczytanaLinia = tekst.substring(dd2, dd3);
                    zapisDane.write(odczytanaLinia);
                    zapisDane.newLine();
                }
                zapisDane.flush();
                zapisDane.close();//zamknięcie strumieni

            } catch (Exception e) {
                raport_txt.setLineWrap(stanZawijania);//brak zawjania
                System.err.println("Unable to create output file.");
                System.err.println(e.getMessage());
                JOptionPane.showMessageDialog(null, "Błąd utworzenia pliku *.odt !!!" + "\nBłąd: " + e.getMessage(), "UWAGA !!!", 2);
            }
            raport_txt.setLineWrap(stanZawijania);//brak zawjania
            JOptionPane.showMessageDialog(null, "Operacja Exportu wyników\nzakończona powodzeniem.", "Export do 'Notatnik' format *.txt", 1);
        }//koniec else
    }//koniec metody

Mam nadzieję że się przyda.
Pozdrawiam

edytowany 1x, ostatnio: tomasz79
bogdans
Kiepski kod. Brakuje sprawdzenia czy użytkownik wskazał (w showSaveDialog()) jakiś plik, tworzenia za każdym razem nowego obiektu JFileChooser i zmuszanie użytkownika by znowu wędrował do katalogu gdzie chce plik zapisać, jest okrucieństwem. Nie dało się bardziej skomplikować podziału tekstu na wiersze?
tomasz79
Nie twierdze że jest idealny. Metoda jak nazwa wskazuje zajmuje się eksportem tekstu do formatu *.txt, czyli za każdym razem będzie prosiła o podanie nazwy pliku. Za pomocą tej metody plik zapisany można otworzyć w zwykłym notatniku, bez wad opisywanych przez "killbot". Ale dzięki za uwagi, będzie okazja do refaktoryzacji metody. Pozdrawiam
bogdans
1. Post niżej masz przykład jak prosto podzielić plik na linie (bez konieczności uwzględniana zawijania linii). 2. Jeżeli użytkownik wyeksportuje plik do katalogu "odległego" od jego konta domowego, to przy ponownej próbie eksportu JFileChooser znów mu zaproponuje katalog domowy i wymusi ponowną wędrówkę po katalogach. 3. Co to jest format TXT?
Olamagato
Pozostaje jeszcze zupełnie pominięta kwestia kodowania, która jest bardzo istotna - szczególnie dla nas.
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Najprościej tak:

Kopiuj
String[] lines = text.getText().split("\n");

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans
KI
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:23
0

Dziękuje Wam bardzo za odpowiedzi:) Mam kolejne pytania:)

  1. czy da się zmienić rozmiar czcionki / styl w JTextArea dla wybranego textu ?
  2. jak zmazać całą zawartość pliku? Czy jest inna metoda niż usunięcie go i stworzenie od nowa ?

Pozdrawia i raz jeszcze dziękuję za pomoc:)

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0
  1. Nie, użyj JEditorPane lub JTextPane (http://docs.oracle.com/javase/tutorial/uiswing/components/text.html).
  2. Zapisz do pliku "pusty" String.

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.