Zapis do pliku text i odczyt

0

Mam problem z odczytem z pliku tekstowego a mianowicie zapis do pliku wygląda następująco

FileOutputStream fos = null;

String str = ( cos);

try {
  fos = new FileOutputStream("ala/plik.txt"); //Otwieranie pliku 
   for(int i = 0; i < str.length(); i++){
     fos.write((int)str.charAt(i)); //Zapis bajt po bajcie każdego znaku...
   }
} catch(IOException ex){
   //System.out.println("Błąd operacji na pliku: "+ex);
}

 try {
  fos.close(); //Zamykanie pliku 
 } catch (IOException e) {
   e.printStackTrace();
}

a odczyt tak:

FileInputStream fos = null;
String str = ( cos);

try {
  fos = new FileInputStream("ala/plik.txt"); //Otwieranie pliku 
   for(int i = 0; i < str.length(); i++){
     fos.read((int)str.charAt(i)); //Zapis bajt po bajcie każdego znaku...
    }
} catch(IOException ex){
   System.out.println("Błąd operacji na pliku: "+ex);
}

 try {
  foe.close(); //Zamykanie pliku 
 } catch (IOException e) {
   e.printStackTrace();
}

odczyt próbowałem zrobić na podstawie zapisu ale jakoś mi nie wychodzi prosiłbym o sprawdzenie kodu odczytu i napisanie błędów w nim znajdujących się.Zapis działa poprawnie.

dodanie znaczników <code class="java"> oraz tagów - fp

0

Kod dla odczytu nie ma żadnego sensu - w pętli for próbujesz korzystać z długości zmiennej "str", która przecież na początku ma wartość "", bo to do niej będziesz przypisywać pobierane z pliku wartości.

Poniżej prezentuję kod, który sprawnie czyta wybrany plik.

import java.io.*;

public class OdczytPliku {
     
     public static void main(String args[]) {
          
          FileInputStream fin = null;
          String str = "";
          
          try {
               
               fin = new FileInputStream("plik.txt");
               
          } catch (FileNotFoundException e) {
               
               System.out.println("Nie znaleziono pliku");
               System.exit(-1);
          }
          BufferedReader inbr = new BufferedReader(new InputStreamReader(fin));
          
          try {
               
               while ((str = inbr.readLine()) != null)
                    System.out.println(str);
               
          } catch (IOException e) {
               
               System.out.println("Błąd wejścia/wyjścia");
          }
     }
}

Pozdrawiam serdecznie.

EDIT###

Jeszcze tylko jedno - zapis też bym zrobił inaczej, a mianowicie tak:

import java.io.*;

public class ZapisDoPliku {
     
     public static void main(String args[]) {
          
          FileOutputStream fout = null;
          String str = "Deprywacja na drodze do doskonałości";
          
          try {
               
               fout = new FileOutputStream("plik.txt");
               
          } catch (FileNotFoundException e) {
               
               System.out.println("Błąd przy próbie otwarcia pliku");
               System.exit(-1);
          }
          DataOutputStream out = new DataOutputStream(fout);
          
          try {
               
               out.writeBytes(str + '\n');
               
          } catch (IOException e) {
               
               System.out.println("Błąd zapisu/odczytu");
          }
     }
}

Pozdr :)

0

dzięki za pomoc.Mam jeszcze takie pytanie jak jest tekst zapisany w następnej linijce w pliku to przy odczycie pojawia się tylko ta ostatnia linia,jak można zrobić żeby odczytywała się cala zawartość pliku a nie tylko sama ostatnia linijka?

0

najprawdopodobniej masz nie w tym miejscu System.out.print lub nadpisujesz, pokaż kod...

0

nie nadpisuje bo w pliku jest dobrze.Może źle trochę napisałem tzn.jak używam

System.out.println();

to jest ok ale ja chcę ten tekst wyświetlić w jTextArea2 więc pisze

jTextArea2.setText(str);

może coś jeszcze powinno być?

dodanie znaczników `` oraz <code class="java"> - fp

0

A więc nadpisujesz. Jeżeli "str = inbr.readLine();", to po każdej iteracji Twojej pętli sczytującej dane z pliku tekstowego następuje przypisanie innej wartości do "str", a Ty za każdym razem metodą "setText(str)" tą nową wartość ustawiasz dla JTextArea - ustawiasz, nie dodajesz. Jeżeli chciałbyś, by kolejne linijki pobranego tekstu były "dodawane" do tych linijek już do JTextArea przesłanych, to powinieneś utworzyć sobie jeszcze jedną zmienną np. typu String, powiedzmy "getTxt" i ustawiać jej wartość na zawartość JTextArea.getText(), po czym dopiero powinieneś ustawiać wartość JTextArea.setText(getTxt + '\n' + str).

EDIT#

Napisałem Ci krótką aplikację demo zapisującą i odczytującą dane z wykorzystaniem JTextArea. Przeanalizuj kod i w razie niejasności pytaj. Mam nadzieję, że dzięki niej rozjaśni Ci się temat prostego zapisu i odczytu danych. Polecam również analizę przykładów Oracle:
http://docs.oracle.com/javase/tutorial/essential/io/buffers.html

Screen apki:
Bez tytułu.jpg

Link do pobrania aplikacji demo:
http://wrzucacz.pl/file/9821376491618/ZapisOdczytDemo.jar
lub
http://wrzuca.cz/file/9821376491618/ZapisOdczytDemo.jar

Kod apki:

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.*;


public class SomeClass extends JFrame {

     private JPanel contentPane;

     public static void main(String[] args) {
          
          EventQueue.invokeLater(new Runnable() {
               
               public void run() {
                    
                    try {
                         
                         SomeClass frame = new SomeClass();
                         frame.setVisible(true);
                         
                    } catch (Exception e) {
                         
                         e.printStackTrace();
                    }
               }
          });
     }

     public SomeClass() {
          
          setTitle("Zapis/Odczyt");
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          setSize(365, 300);
          setLocationRelativeTo(null);

          contentPane = new JPanel();
          contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
          setContentPane(contentPane);
          
          GridBagLayout gbl_contentPane = new GridBagLayout();
          gbl_contentPane.columnWidths = new int[]{98, 150, 37, 0};
          gbl_contentPane.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
          gbl_contentPane.columnWeights = new double[]{1.0, 1.0, 0.0, Double.MIN_VALUE};
          gbl_contentPane.rowWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
          contentPane.setLayout(gbl_contentPane);
          
          JScrollPane scrollPane = new JScrollPane();
          GridBagConstraints gbc_scrollPane = new GridBagConstraints();
          gbc_scrollPane.gridheight = 7;
          gbc_scrollPane.gridwidth = 3;
          gbc_scrollPane.insets = new Insets(0, 0, 5, 5);
          gbc_scrollPane.fill = GridBagConstraints.BOTH;
          gbc_scrollPane.gridx = 0;
          gbc_scrollPane.gridy = 0;
          contentPane.add(scrollPane, gbc_scrollPane);
          
          final JTextArea textArea = new JTextArea();
          scrollPane.setViewportView(textArea);
          
          JLabel plikLabel = new JLabel("Lokalizacja pliku");
          GridBagConstraints gbc_plikLabel = new GridBagConstraints();
          gbc_plikLabel.anchor = GridBagConstraints.EAST;
          gbc_plikLabel.insets = new Insets(0, 0, 5, 5);
          gbc_plikLabel.gridx = 0;
          gbc_plikLabel.gridy = 7;
          contentPane.add(plikLabel, gbc_plikLabel);
          
          final JTextField plikField = new JTextField();
          GridBagConstraints gbc_plikField = new GridBagConstraints();
          gbc_plikField.gridwidth = 2;
          gbc_plikField.insets = new Insets(0, 0, 5, 0);
          gbc_plikField.fill = GridBagConstraints.HORIZONTAL;
          gbc_plikField.gridx = 1;
          gbc_plikField.gridy = 7;
          contentPane.add(plikField, gbc_plikField);
          
          JButton zapisz = new JButton("Zapisz");
          zapisz.addActionListener(new ActionListener() {
               
               public void actionPerformed(ActionEvent arg0) {
                    
                    BufferedWriter writer;

                    String plik = plikField.getText();
                    
                    try {
                         /*
                          *  "new FileWriter(plik, true)" jeżeli chcesz dodawać 
                          *  napisany tekst do tego, któy już znajduje się w pliku
                          */
                         writer = new BufferedWriter(new FileWriter(plik)); 
                         textArea.write(writer);
                         writer.close();
                         
                    } catch (IOException e) {
                         
                         JOptionPane.showMessageDialog(null, e);
                    }
               }
          });
          GridBagConstraints gbc_zapisz = new GridBagConstraints();
          gbc_zapisz.insets = new Insets(0, 0, 0, 5);
          gbc_zapisz.gridx = 0;
          gbc_zapisz.gridy = 8;
          contentPane.add(zapisz, gbc_zapisz);
          
          JButton odczytaj = new JButton("Odczytaj");
          odczytaj.addActionListener(new ActionListener() {
               
               public void actionPerformed(ActionEvent arg0) {
                    
                    BufferedReader reader;
                    
                    String plik = plikField.getText();
                    
                    try {
                         
                         reader = new BufferedReader(new InputStreamReader(new FileInputStream(plik)));
                         textArea.read(reader, null);
                         reader.close();
                         
                    } catch (IOException e) {
                         
                         JOptionPane.showMessageDialog(null, e);
                    } 
               }
          });
          GridBagConstraints gbc_odczytaj = new GridBagConstraints();
          gbc_odczytaj.insets = new Insets(0, 0, 0, 5);
          gbc_odczytaj.gridx = 1;
          gbc_odczytaj.gridy = 8;
          contentPane.add(odczytaj, gbc_odczytaj);
          
          JButton wyczysc = new JButton("Wyczy\u015B\u0107");
          wyczysc.addActionListener(new ActionListener() {
               
               public void actionPerformed(ActionEvent e) {
                    
                    plikField.setText("");
                    textArea.setText("");
               }
          });
          GridBagConstraints gbc_wyczysc = new GridBagConstraints();
          gbc_wyczysc.gridx = 2;
          gbc_wyczysc.gridy = 8;
          contentPane.add(wyczysc, gbc_wyczysc);
     }
}

Pozdrawiam serdecznie :)

0

Zamień

jTextArea2.setText(str);

najTextArea2.append("\n"+str);

0

Działa dzięki.A dało by się tak zrobić aby to co zapisuje do pliku nie było nadpisywane nowym tekstem jeżeli wyłączę i ponownie włączę program,bo pÓÓÓÓki co po ponownym włączeniu program nadpisuje tekst który już jest w pliku,chciałbym aby był on dopisywany do już istniejącego tekstu.

0

Czytaj odpowiedzi.

try {
/*
* "new FileWriter(plik, true)" jeżeli chcesz dodawać
* napisany tekst do tego, któy już znajduje się w pliku
*/

0

Z tym zapisem sobie juz poradziłem ale mam jeszcze takie pytanie gdyż jak kliknę np. dwa razy na przycisk wczytaj to w polu jTextArea2 wczytuje mi się dwukrotnie tekst i w związku z tym chciałbym aby niezależnie od tego ile razy wcisnę ten przycisk to żeby wyświetlał mi się tylko raz ten tekst.Przesyłam kod wczytywania się może coś w nim jeszcze brakuje.

 FileInputStream fin = null;
        String str ="";
        try {

            fin = new FileInputStream("a.txt");

        } catch (FileNotFoundException e) {

            jTextArea2.setText("Nie znaleziono pliku");
            //System.out.println("Nie znaleziono pliku");
            System.exit(-1);
        }
        BufferedReader inbr = new BufferedReader(new InputStreamReader(fin));

        try {

            while ((str = inbr.readLine()) != null)
            // System.out.println(str);
            // jTextArea2.setText(getText + '\n' + str);
            jTextArea2.append(str+"\n");
        } catch (IOException e) {

            jTextArea2.setText("Błąd wejścia/wyjścia");

dodanie znacznika <code class="java"> - fp

0
JButton odczytaj = new JButton("Odczytaj");
          odczytaj.addActionListener(new ActionListener() {
 
               public void actionPerformed(ActionEvent arg0) {
 
                    BufferedReader reader;
 
                    String plik = plikField.getText();

                    textArea.setText(""); // Czyść pole tekstowe przed załadowaniem pliku
 
                    try {
 
                         reader = new BufferedReader(new InputStreamReader(new FileInputStream(plik)));
                         textArea.read(reader, null);
                         reader.close();
 
                    } catch (IOException e) {
 
                         JOptionPane.showMessageDialog(null, e);
                    } 
               }
          });
0

dzięki już też sam doszedłem jak to zrobić;) dzięki za pomoc i cierpliwość do mnie ;)

0

Mam jeszcze takie pytanie jak zrobić żeby tekst był czytany z polskimi literami jak by się dało to proszę o taką odpowiedź żeby była zgodna z moim kodem źródłowym do odczytywania :),ponieważ na razie w miejsce polskich znaków wypisuje się znal : "[]".

 b++;
       if(b>1){
           jTextArea2.setText(" ");
           b=1;
       } 
        FileInputStream fin = null;
        String str ="";
        try {

            fin = new FileInputStream(dz+".txt");

        } catch (FileNotFoundException e) {

            jTextArea2.setText("Nie znaleziono pliku");
            //System.out.println("Nie znaleziono pliku");
            System.exit(-1);
        }
        BufferedReader inbr = new BufferedReader(new InputStreamReader(fin));

        try {

            while ((str = inbr.readLine()) != null)
      if(b==1){ 
               jTextArea2.append("\n" + str);
           }
               
        } catch (IOException e) {

            jTextArea2.setText("Błąd wejścia/wyjścia"); 

dodanie znacznika <code class="java"> - fp

0

Plik tekstowy tworzysz sam? Jeśli tak, to jakim programem? Jeśli nie, to jakie jest kodowanie w tym pliku?

0

pisze w notatniku ale okazało się że to w notatniku jest błędnie napisane dzięki za zainteresowanie

0

Mam taki problem trochę z innej beczki ;) a mianowicie chciałbym zrobić żeby jeden przycisk typu RadioButton był zaznaczony od razu po uruchomieniu aplikacji,nie wiem czy to ma jakieś znaczenie mam dwa Radio Buttony połączone w grupę.
Znalazłem coś takiego ale to jest chyba do kody HTML : <input type="radio" name="odpowiedz" value="tak" checked>Tak<br>
i coś takiego:<input type="checkbox" name="zainteresowania" value="sport" checked>Sport<br>
ten pierwszy dotyczy pola jednokrotnego wyboru - radiol, a drugi dotyczy pola wielokrotnego wyboru - checkbox
ja robię w JFrame i chyba trochą muszę ten kod zmodyfikować(jeżeli to jest któryś z tych) :-) proszę o potwierdzenie czy to są te kody czy też nie.

0

O_o, to nie są właściwe kody. Wywołaj setSelected(true);.

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