Problem ze stworzeniem ścieki do pliku oraz pliku.

0

Witam,

Mam taki problem. Tworze program, który ma zapisywać wprowadzone dane do pliku. Wszystko jest ok, tylko gdy klikam przycisk aby dane zostały wprowadzone do pliku wyskakuje mi błąd, że system nie może odnaleść ścieżki. Już kombinowałem na wiele sposobów, czytałem różne fora, porady i nic.

Podam fragment kodu, który odpowiada za niby tworzenie się pliku, gdy nie istnieje:

 

File plik = new File("D:/folder1/folder2/readme.txt");
        FileWriter fw = new FileWriter(plik);
        BufferedWriter bw = new BufferedWriter(fw);

        if(plik.exists()){
            
         String zmienna1 = TextField1.getText();
         String zmienna2 = TextField2.getText();
         String zmienna3 = TextField3.getText();
         String zmienna4 = TextField4.getText();
         String zmienna5 = ComboBox1.toString();
            
         String[] dane = { wartosc1, wartosc2, wartosc3, wartosc4, wartosc5 };
         int i;
         
         try{ 
            try{ 
                for(i=0; i <= dane.length; i++){  
                    bw.write(dane[i]);
                }
                bw.newLine();
            }finally{
                bw.close();
                label2.setText("Jakiś tekst gdy wszystko przebiegnie dobrze.");
                
                TextField1.setText("");
                TextField2.setText("");
                TextField3.setText("");
                TextField4.setText("");
                ComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "wartość1", "wartość2", "wartość3", "wartość4" }));
                
            } 
         }catch(IOException e){
           
             JOptionPane.showMessageDialog(null,
                                           "Wystąpił błąd: " + e,
                                           "Błąd",
                                           JOptionPane.ERROR_MESSAGE);
             
         }
       
         }else if(!plik.exists() && !plik.mkdirs()){
             
         plik.mkdir();
         plik.createNewFile();
             
         String zmienna1 = TextField1.getText();
         String zmienna2 = TextField2.getText();
         String zmienna3 = TextField3.getText();
         String zmienna4 = TextField4.getText();
         String zmienna5 = ComboBox1.toString();
             
         String[] dane = { wartosc1, wartosc2, wartosc3, wartosc4, wartosc5 };
         int i;
         
            try{
                try{ 
                    for(i=0; i <= dane.length; i++){  
                        bw.write(dane[i]);
                    }
                bw.newLine();
                }finally{
                    bw.close();
                    label2.setText("Jakiś tekst gdy wszystko przebiegnie dobrze.");
                    
                   TextField1.setText("");
                   TextField2.setText("");
                   TextField3.setText("");
                   TextField4.setText("");
                    ComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "wartość1", "wartość2", "wartość3", "wartość4" }));
                
                }
            }catch(IOException e){
                    JOptionPane.showMessageDialog(null,
                                           "Wystąpił błąd: " + e,
                                           "Błąd",
                                           JOptionPane.ERROR_MESSAGE);
            }   
         }   
    }

Już brak mi pomysłów.
Będę wdzięczny za szybką odpowiedź :)

Pozdrawiam
P.

0

A masz katalog "D:/folder1/folder2"?

0

Kilka uwag:

  1. Jeżeli nie ma pliku i tworzysz do niego obiekt FileWriter to rzuci Ci wyjątkiem. Najpierw stwórz plik, a potem dopiero dodaj do niego bufor zapisu.
  2. Przed stworzeniem pliku stwórz katalogi. W tym celu należy uciąć nazwę pliku ze ścieżki, stworzyć nowy obiekt typu File, a potem wywołać odpowiednią funkcję.
  3. Strasznie Ci się powtarza ten kod. Brzydki jest w pizdu.
  4. Jak masz pętle for z zapisem do pliku to źle masz określony warunek stopu. Powinno być samo <. W wersji obecnej rzuci Ci wyjątkiem.
0

Przebiłem się przez cały (brzydki) kod.

File plik = new File("D:/folder1/folder2/readme.txt");
plik.mkdirs();

stworzy katalog D:/folder1/folder2/readme.txt, na pewno o to Ci chodzi?
Powinno być raczej tak:

File plik = new File("D:/folder1/folder2");
plik.mkdirs();
plik = new File("D:/folder1/folder2/readme.txt");
0

po 1)wiem że kod do najładniejszych nie należy. Na swoje usprawiedliwienie mam tylko tyle, ze jestem początkującym programistom i tak naprawde dopiero się ucze.
po 2) czy jest sposob by te katalogi robily sie automatycznie? zebym nie musial ich tworzyc za każdym razem recznie?
po 3) wiem że się powtarza kod, ale na razie robie to "na brudno". Później będę kombinował nad jego poprawieniem

0

Co znaczy

katalogi robily sie automatycznie
Komputer ma zgadnąć jakie katalogi utworzyć? Jeżeli nie o to chodzi, to napisałem Ci w poprzednim poście jak utworzyć potrzebne katalogi. Byłeś łaskaw przeczytać?
Imo, kod należy od razu pisać "na czysto", oszczędzisz sobie mnóstwo pracy.

0

Sory, ale jak już napisałem profesjonalnym programistom nie jestem, a zajrzałem tutaj bo szukałem rady, a jak na razie odczuwam wasze odpowiedzi jak karcenie mnie za to że staram się ogarnać jave. Zajżałem do poprzednich postów, jeszcze ich nie wypróbowałem, zaraz się tym zajmę z resztą.

0

A ja odbieram powtórne zadawanie pytania - po otrzymaniu odpowiedzi - za przejaw lekceważenia.

0

Ok, sorry mój błąd. Bo powinienem najpierw sprawdzić i poprawić błędy jakie miałem, a dopiero później pisać posty dalej. Poprawiłem i usunąłem if'a. Kod działa (mniej więcej) tak jak chciałem, jednak dalej sypie błędami, a w pliku pojawiają się wpisy, których nie chce mnie mieć

0

Nikt Cię tu nie karci. Programowanie to nie jest spawanie "byle się trzymało" tylko pisanie kodu, który ma być: poprawny, efektywny i co ważne czytelny. Część firm szukając pracowników prosi ich o przesłanie swoich próbek kodu w celu oceny jego jakości. Co jednak ważniejsze: do pewnych fragmentów kodu będziesz musiał sam wrócić po miesiącach przerwy, albo co gorsza dać kolegom. W związku z powyższym trzeba unikać złego stylu w programowaniu już od samego początku, bo złych nawyków ciężko się pozbyć.

Po drugie: Dostałeś stosunkowo jasne instrukcje co należy zrobić. Przed stworzeniem pliku musisz stworzyć katalog. W tym celu (tak jak pisałem) najłatwiej jest usunąć ze ścieżki do pliku jego nazwę, utworzyć katalog, a dopiero wtedy plik. Jak dobrać się do ścieżki katalogu? Poczytaj sobie o funkcjach "lastIndexOf" oraz "substring" z klasy String. Pomyśl chwilę, bo zadanie na serio nie jest trudne ;)

Pozdrawiam serdecznie

0

Ok. Katalogi już się tworzą tak jak to miałem na myśli, a nie umiałem jej przekazać. Tworzy mi plik o nazwie, którą podaje. Pobiera mi te dane z tych fieldów, jednak pojawia się problem, ponieważ z comboBoxa, nie pobiera mi warianu, który wybieram. starałem się już zrobić comboBox.toString() i comboBox.getName(), jednakże nie zapisuje mi wybranego wariantu do pliku.

Ok poradziłem sobie z następnym problemem :) Już mi pobiera z comboBoxa wariant, który wybieram sobie i zapisuje mi go do pliku tekstowego (już poprawnie :D) jeszcze raz sorki za wszelkie kłopoty jakie wam sprawiłem i za poszarpane nerwy. :)

Pozdrawiam :)
P.

0

Witam to znowu ja z kolejnym problemem.
Mój problem polega na tym, że jak wczytuję zawartość pliku to daję go do stringa i wyświetlam w textArea.
Wszystko jest ok gdyby nie to, że jak wpisuje kolejne wartości do pliku i je z czytuje to stara wartość dalej jest wyświetlana w textArea pomimo że wcześniej go czyszczę. Mogę te informacje o tym co znajduje się pliku przebywać dalej w buforze? Jeżeli tak to jak go wyczyścić?
Próbowałem już kombinacjami typu reset(), mark(), textArea.setText("") i nic.

Jak zawszę podaję kod.

        String imieOsoby = imieTextField.getText();
        String nazwiskoOsoby = nazwiskoTextField.getText();
        String telefonOsoby = telefonTextField.getText();
        String adresOsoby = adresTextField.getText();
        String typOsoby = (String) typComboBox.getSelectedItem();
        String znak = "=================";
        
        //sprawdzamy czy wszystkie wymagane pola zostały wypełnione
        if(imieOsoby.isEmpty() == true || nazwiskoOsoby.isEmpty() == true || telefonOsoby.isEmpty() == true || adresOsoby.isEmpty() == true){
           JOptionPane.showMessageDialog(null,
                                        "Aby dodać nową osobę, wszystkie pola muszą zostać wypełnione.\nNie dodano nowej osoby.",
                                        "Błąd",
                                        JOptionPane.ERROR_MESSAGE);
        }else{
        
        //Sprawdzanie czy dany plik istnieje.
        //Jeżeli nie to stwórz katalogi oraz plik i zapisz do niego informacje
        if(!plik.exists()){
            plik = new File("D:/Iza/Książka_telefoniczna/");
            plik.mkdirs();
            plik = new File("D:/Iza/Książka_telefoniczna/readme.txt");
        }
         
         FileReader fr = new FileReader(plik);
         BufferedReader br = new BufferedReader(fr);
         String s;
         String old = "";
         
         while((s = br.readLine()) != null){
            old = old + "\r\n" + s;
         }
         br.close();

         FileWriter fw = new FileWriter(plik);
         BufferedWriter bw = new BufferedWriter(fw);

         try{ 
             bw.write(old);
             bw.newLine();
             bw.write(imieOsoby);
             bw.newLine();
             bw.write(nazwiskoOsoby);
             bw.newLine();
             bw.write(telefonOsoby);
             bw.newLine();
             bw.write(adresOsoby);
             bw.newLine();
             bw.write(typOsoby);
             bw.newLine();
             bw.write(znak);
             bw.close();
         
             label2.setText("Osoba została dodana poprawnie.");

          //Wyczyść/zresetuj pola
             imieTextField.setText("");
             nazwiskoTextField.setText("");
             telefonTextField.setText("");
             adresTextField.setText("");
          
          //ponowne wczytanie pliku i jego zawartośći, wyczyszczenie pola textArea i wyświetlenie nowej wartości
            fr = new FileReader(plik);
            br = new BufferedReader(fr);

                while((s = br.readLine()) != null){
                    old = old + "\r\n" + s;
                }
                br.close();
                textArea.setText("");
                textArea.setText(old);
                
          }catch(IOException e){
             JOptionPane.showMessageDialog(null,
                                           "Wystąpił błąd: " + e,
                                           "Błąd",
                                           JOptionPane.ERROR_MESSAGE);
          }
        }

Może nie potrzebnie używam później drugi raz bufferedReader? A może wyjść później z tego if'a?
Nie mam już pomysłów, co zrobić aby ten textArea został wyczyszczony, a poźniej żeby nowa zawartość pliku tekstowego została w nim wyświetlona.
(I proszę nie wypisywać komentarzy, że kod jest brzydki, a jeżeli naprawdę będziecie musieli napisać jakiś komentarz co do kodu to proszę o korektę błędu, jak byście to wy napisali)

Z góry dziękuję za pomoc.

0

Na wstępie chce dodać, że wiem że post jest zdublowany, ale nie wiem czemu dodało mi go gdzieś w środek tematu, dlatego powtarzam go jeszcze raz. Jeżeli nie jest to dozwolone to sorrki.

Witam to znowu ja z kolejnym problemem.
Mój problem polega na tym, że jak wczytuję zawartość pliku to daję go do stringa i wyświetlam w textArea.
Wszystko jest ok gdyby nie to, że jak wpisuje kolejne wartości do pliku i je z czytuje to stara wartość dalej jest wyświetlana w textArea pomimo że wcześniej go czyszczę. Mogę te informacje o tym co znajduje się pliku przebywać dalej w buforze? Jeżeli tak to jak go wyczyścić?
Próbowałem już kombinacjami typu reset(), mark(), textArea.setText("") i nic.

Jak zawszę podaję kod.

    String imieOsoby = imieTextField.getText();
    String nazwiskoOsoby = nazwiskoTextField.getText();
    String telefonOsoby = telefonTextField.getText();
    String adresOsoby = adresTextField.getText();
    String typOsoby = (String) typComboBox.getSelectedItem();
    String znak = "=================";

    //sprawdzamy czy wszystkie wymagane pola zostały wypełnione
    if(imieOsoby.isEmpty() == true || nazwiskoOsoby.isEmpty() == true || telefonOsoby.isEmpty() == true || adresOsoby.isEmpty() == true){
       JOptionPane.showMessageDialog(null,
                                    "Aby dodać nową osobę, wszystkie pola muszą zostać wypełnione.\nNie dodano nowej osoby.",
                                    "Błąd",
                                    JOptionPane.ERROR_MESSAGE);
    }else{

    //Sprawdzanie czy dany plik istnieje.
    //Jeżeli nie to stwórz katalogi oraz plik i zapisz do niego informacje
    if(!plik.exists()){
        plik = new File("D:/Iza/Książka_telefoniczna/");
        plik.mkdirs();
        plik = new File("D:/Iza/Książka_telefoniczna/readme.txt");
    }

     FileReader fr = new FileReader(plik);
     BufferedReader br = new BufferedReader(fr);
     String s;
     String old = "";

     while((s = br.readLine()) != null){
        old = old + "\r\n" + s;
     }
     br.close();

     FileWriter fw = new FileWriter(plik);
     BufferedWriter bw = new BufferedWriter(fw);

     try{ 
         bw.write(old);
         bw.newLine();
         bw.write(imieOsoby);
         bw.newLine();
         bw.write(nazwiskoOsoby);
         bw.newLine();
         bw.write(telefonOsoby);
         bw.newLine();
         bw.write(adresOsoby);
         bw.newLine();
         bw.write(typOsoby);
         bw.newLine();
         bw.write(znak);
         bw.close();

         label2.setText("Osoba została dodana poprawnie.");

      //Wyczyść/zresetuj pola
         imieTextField.setText("");
         nazwiskoTextField.setText("");
         telefonTextField.setText("");
         adresTextField.setText("");

      //ponowne wczytanie pliku i jego zawartośći, wyczyszczenie pola textArea i wyświetlenie nowej wartości
        fr = new FileReader(plik);
        br = new BufferedReader(fr);

            while((s = br.readLine()) != null){
                old = old + "\r\n" + s;
            }
            br.close();
            textArea.setText("");
            textArea.setText(old);

      }catch(IOException e){
         JOptionPane.showMessageDialog(null,
                                       "Wystąpił błąd: " + e,
                                       "Błąd",
                                       JOptionPane.ERROR_MESSAGE);
      }
    }

Może nie potrzebnie używam później drugi raz bufferedReader? A może wyjść później z tego if'a?
Nie mam już pomysłów, co zrobić aby ten textArea został wyczyszczony, a poźniej żeby nowa zawartość pliku tekstowego została w nim wyświetlona.
(I proszę nie wypisywać komentarzy, że kod jest brzydki, a jeżeli naprawdę będziecie musieli napisać jakiś komentarz co do kodu to proszę o korektę błędu, jak byście to wy napisali)

Z góry dziękuję za pomoc.

0

A może byś tak wyczyścił zmienną old?

            br = new BufferedReader(fr);
            old=""; //!!!!
                while((s = br.readLine()) != null){
                    old = old + "\r\n" + s;
                }

Druga sprawa, konkatenacja jest wolna, powinieneś raczej użyć StringBuildera:

StringBuilder old = new StringBuilder("");
...
old.append("\r\n"+s);
...
textArea.setText(old.toString());
0

Fakt zapomniałem o tej zmiennej i nie wziąłem tego pod uwage.

Dzięki za pomoc

0

Teraz działa jak należy :) Dzięki jeszcze raz wielkie za pomoc. :)

Mam jeszcze taki tyci, tyci problem, ale myślę że sobie z nim poradzę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1