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
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)