wyświetlenie zawartości pliku

0

Witam,
mam do napisania prosty notatnik. Ponieważ są to moje początki w świecie Javy napotykam co chwile jakieś problemy. Często sobie jakoś z nimi radzę. Tym razem chyba jest to bardzo zakręcone albo jest tak proste, że szukam nie tam gdzie trzeba.

Otóż chciałbym, aby użytkownik mógł wybrać plik tekstowy, a później jego zawartość została wyświetlona. JFileChoosera już użyłem i wszystko mi się wyświetla, mogę zaznaczyć jakiś plik itd. Teraz jak zrobić aby ten wybrany plik, a raczej jego zawartość wyświetliła mi się w notatniku ??

1

Możesz to zrobić np. tak :

 File txt;
        txt = new File("xxx.txt");
        String dane = "";
        String daneOut = "";

        try {

            BufferedReader odczytaj = new BufferedReader(new FileReader(txt));


            while ((dane = odczytaj.readLine()) != null) {
                // tutaj dane które odczytasz zapisujesz gdzie chcesz
            }
        } catch (IOException e) {}
    }

 

zamiast podawać w file konkretny plik możesz użyć zastosowanego JFileChoser uslatając ścieżkę do wybranego pliku

open = fd.getSelectedFile().getPath();
gdzie fr - to JFileChoser

0
            Runtime r=Runtime.getRuntime();
            Process p=null;
            String[] cmd={"notepad.exe",fc.getSelectedFile().getAbsolutePath()};
            try
            {
                p=r.exec(cmd);
            }
            catch (Exception e)
            {
                System.out.println(e);
            }
0
remigio napisał(a)

Możesz to zrobić np. tak :

 File txt;
        txt = new File("xxx.txt");
        String dane = "";
        String daneOut = "";

        try {

            BufferedReader odczytaj = new BufferedReader(new FileReader(txt));


            while ((dane = odczytaj.readLine()) != null) {
                // tutaj dane które odczytasz zapisujesz gdzie chcesz
            }
        } catch (IOException e) {}
    }

 

zamiast podawać w file konkretny plik możesz użyć zastosowanego JFileChoser uslatając ścieżkę do wybranego pliku

open = fd.getSelectedFile().getPath();
gdzie fr - to JFileChoser

Ok :) Poszło i wszystko ładnie działa, tylko nie wiem jak przekierować wyświetlenie z konsoli na JTextArea, bo chyba tego trzeba użyć. Chwilowo po wybraniu pliku mam wynik na konsoli :)

1
            while ((dane = odczytaj.readLine()) != null) {
                ta.append(dane+"\n");
            }

ta, to JTextArea, readLine() czyta bez znaku nowego wiersza, stad konieczność +"\n".

0
bo napisał(a)

ta, to JTextArea, readLine() czyta bez znaku nowego wiersza, stad konieczność +"\n".

To znaczy że kiedy damy na końcu "\n" to wyświetli cały tekst (tzn. wszystkie wiersze notatnika)? Bo ja też próbowałem
wyświetlić plik w JTextArea() ale wyświetlał tylko ostatnią linijkę - czy trzeba napisać całą instrukcję ? Na konsoli wyświetla cały tekst.

          
                ta.append(dane+"\n");
            

... i proszę o objasnienie metody append() bo nie znam : )

0
bo napisał(a)
            while ((dane = odczytaj.readLine()) != null) {
                ta.append(dane+"\n");
            }

ta, to JTextArea, readLine() czyta bez znaku nowego wiersza, stad konieczność +"\n".

Dziękuje, 'bo' działa :) Wszystko wydaje się proste jak już się to zrozumie. Mam nadzieję, że kiedyś będę mógł i ja pomóc :)

0
szypxx napisał(a)
bo napisał(a)

ta, to JTextArea, readLine() czyta bez znaku nowego wiersza, stad konieczność +"\n".

To znaczy że kiedy damy na końcu "\n" to wyświetli cały tekst (tzn. wszystkie wiersze notatnika)? Bo ja też próbowałem
wyświetlić plik w JTextArea() ale wyświetlał tylko ostatnią linijkę - czy trzeba napisać całą instrukcję ? Na konsoli wyświetla cały tekst.

          
                ta.append(dane+"\n");
            

... i proszę o objasnienie metody append() bo nie znam : )

append dokleja (dodaje) do końca pliku to co tam masz. Natomiast '\n' oznacza złamanie wiersza - znak nowej linii. Bez tego append by ci doklejało ale nie przechodziło do nowego wiersza po doklejeniu kolejnej linii i wszystko byś miał w jednym ciągu.

Oczywiście musisz przekazać do tej metody swoje JTextArea w konstruktorze :) Jak by co to ci pomogę, bo ja już się z tym uporałem.

0

No to już rozumiem.
Bo właśnie nie chciało mi się grzebać (sorki;) i szukać metody co umożliwia wyświetlanie kolejnych wierszy.
Dzięki za objaśnienie.

Mam jeszcze pytanie: skoro append() wyświetla na końcu to jaka metoda wyświetla na początku ?

Nie chcę znoobić ale czy append(args, false) ? // tak jakby logicznie rzecz biorąc

zdaje się że niektóre metody tak mają.

0

Jak chcesz dodać wiersz na początku, to

  ta.setText("Bardzo ważny, ale zapomniany wiersz \n"+ta.getText());      
0

No to jak już nam tak pięknie idzie, bo znaleźć nie mogę metody, która mi pobierze nazwę pod jaką chce zapisać plik.
Mam coś takiego:

public void actionPerformed(ActionEvent e) {
        try {
        JFileChooser choos = new JFileChooser(System.getProperty("user.dir"));
        int returnVal = choos.showSaveDialog(null);
        String name = choos.getName();

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(name));
        oos.writeObject(area.getText());
        oos.close();
        } catch (IOException ex) {
            Logger.getLogger(SaveHandler.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Po kliknięciu na Zapisz w notatniku pokazuje mi się okno wyboru gdzie, pod jaką nazwą itd. Chce teraz, aby jakoś zapisać ten plik pod tą nazwą. Jak ją pobrać.
Do tego widzę, że mam problem z tym, że nawet bez tego okna jak zapisywałem pod "jakasnazwa.txt" to nic mi tego nie mogło odczytać bo na początku mam jakieś krzaki :( Co z tym zrobić ??

1
  1. Nie powinieneś tworzyć za każdym razem na nowo JFileChoosera, to nie jest user friendly. Użytkownik za pierwszym razem wybierze jakiś katalog, do którego chce pisać, a Ty i tak zaproponujesz przy następnym zapisywaniu katalog domowy (chyba żaden edytor tak nie działa).
  2. Użytkownik może kliknąć Cancel
        int returnVal = choos.showSaveDialog(null);
        if (returnVal == JFileChooser.APPROVE_OPTION)
        {
           String name = choos.getName(choos.getSelectedFile());
  1. Nie zapisuj jako obiekt (ObjectOutputStream).
0

Widzę, że chyba źle się za to zabrałem. Czyli wynika z tego, że muszę zrobić sobie oddzielną klasę, która będzie obsługiwać zapis i odczyt. Czyż nie tak ??

Uporałem się z zapisem do pliku, tak żebym miał to co chciałem. To znaczy, żeby po zapisie można było wszędzie odczytać plik.
Teraz jak byś mógł mi wytłumaczyć w jaki sposób zrobić to, żeby nie tworzyć nowego JFileChoosera tylko żeby po wybraniu użytkownik mógł zapisać do tego katalogu z którego plik otwierał ;)

0

Niekoniecznie, choos powinno być polem w klasie. Tworzysz ten obiekt w konstruktorze albo przed pierwszy użyciem (otwarcie lub zapis pliku)

if(choos==null)
{
   choos = new JFileChooser(); //równoważne z new JFileChooser(System.getProperty("user.dir"));
}

a zapisujesz tak

if(choos.showSaveDialog(this /*null*/)==JFileChooser.APPROVE_OPTION)
{
    String name = choos.getSelectedFile().getAbsolutePath();
    try
    {
          FileWriter f=new FileWriter(name);
          f.write(ta.getText());
          f.close();
   }
   catch(Exception e)
   {
          ...
   }
}
0

To jest moja klasa otwierająca i zapisująca plik. Otwiera i zapisuje ale coś niestety jak otworzy to nie pamięta ścieżki. Wiem, że ja traci z pamięci zapewne. Ale co i jak poprawić to nie wiem. Głowię się jak ale... pustka ;)
Może mnie ktoś naprowadzić ??

 
class OpenSaveHandler implements ActionListener{
        private JFileChooser choos;
        private JTextArea ta;
        private BufferedReader br = null;
        private String data, name, what;
        private FileWriter fw;


    public OpenSaveHandler(JTextArea area, String w){
        if(choos==null) {
            choos = new JFileChooser();
        }
        ta = area;
        what = w;
    }

    public void actionPerformed(ActionEvent e) {

        if(what.equals("open")) {
            try {
                choos.showOpenDialog(ta);
                name = choos.getSelectedFile().getAbsolutePath();
                File file = new File(name);
               
                br = new BufferedReader(new FileReader(file));
                try {
                    while ((data = br.readLine()) != null) {
                        ta.append(data + '\n');
                    }
                } catch (IOException ex) {
                    Logger.getLogger(OpenSaveHandler.class.getName()).log(Level.SEVERE, null, ex);
                }
                try {
                    br.close();
                } catch (IOException ex) {
                    Logger.getLogger(OpenSaveHandler.class.getName()).log(Level.SEVERE, null, ex);
                }
            } catch (FileNotFoundException ex) {
                Logger.getLogger(OpenSaveHandler.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        
        if(what.equals("save")){
            choos.showSaveDialog(ta);
            try {
                fw = new FileWriter(name);
            } catch (IOException ex) {
                Logger.getLogger(OpenSaveHandler.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                fw.write(ta.getText());
            } catch (IOException ex) {
                Logger.getLogger(OpenSaveHandler.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                fw.close();
            } catch (IOException ex) {
                Logger.getLogger(OpenSaveHandler.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
0

Sądząc z budowy konstruktora i kodu metod tworzysz w klasie głównej dwie instancje klasy OpenSaveHandler. Masz więc dwa różne obiekty typy JFileChooser.

0
bo napisał(a)

Sądząc z budowy konstruktora i kodu metod tworzysz w klasie głównej dwie instancje klasy OpenSaveHandler. Masz więc dwa różne obiekty typy JFileChooser.

Nie wiem czy teraz dobrze myślę. Za każdym razem jak używam tej klasy czy to do odczytu czy do zapisu wywoływany jest konstruktor. Dlatego też w name nie pamięta ścieżki do pliku. Czy tak ??

0

Tak, masz dwa konstruktory, dwa pola typu JFileChooser, dwa pola o nazwie name.

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