cloudx Posted December 2, 2007 Report post Posted December 2, 2007 Mam problem i potrzebuję pomocy. Otóż: program nie czyta mi wszystkich linijek pliku - czyta tylko pierwszą. Co wpisać żeby czytał wszystkie linijki? Proszę o szybką odpowiedź. To ważne. import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class Pliki { public static void main(String[] args) throws IOException { BufferedReader plikWejsciowy = new BufferedReader(new FileReader("dane.txt")); System.out.println("Tekst, ktory zostal przeczytany z pliku:"); String linia; linia = plikWejsciowy.readLine(); System.out.println(linia); linia = linia.replaceAll("cos", "nic"); BufferedWriter plikWyjsciowy = null; try { plikWyjsciowy = new BufferedWriter(new FileWriter("wynik.txt")); System.out.println("Tekst, ktory został zapisany do pliku wynik.txt:"); System.out.println(linia); plikWyjsciowy.write(linia); } catch (FileNotFoundException fnf) { System.err.println("BŁĄD zapisu! Plik nie znaleziony."); } catch (SecurityException se) { System.err.println("BŁĄD zapisu! Zabroniony dostęp do pliku."); } finally { plikWyjsciowy.close(); } plikWejsciowy.close();}} Quote Share this post Link to post Share on other sites More sharing options...
PelzaK Posted December 2, 2007 Report post Posted December 2, 2007 a jak ma czytać wszystkie skoro czytasz raz tylko jedną linię? linia = plikWejsciowy.readLine(); :) Quote Share this post Link to post Share on other sites More sharing options...
thuGG Posted December 2, 2007 Report post Posted December 2, 2007 Innymi słowy, musisz użyć pętli. Quote Share this post Link to post Share on other sites More sharing options...
cloudx Posted December 2, 2007 Report post Posted December 2, 2007 (edited) Innymi słowy, musisz użyć pętli. ok mam teraz tak: import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class Pliki { public static void main(String[] args) throws IOException { BufferedReader plikWejsciowy = new BufferedReader(new FileReader("dane.txt")); System.err.println("Tekst, ktory zostal przeczytany z pliku:"); String linia; int i=1; while (true) //wypisywanie kolejnych linijek tekstu w konsoli { linia = plikWejsciowy.readLine(); System.out.println(linia); i++; if (linia == null) { break; } } linia = linia.replaceAll("cos", "nic"); BufferedWriter plikWyjsciowy = null; try { plikWyjsciowy = new BufferedWriter(new FileWriter("wynik.txt")); System.err.println("Tekst, ktory został zapisany do pliku wynik.txt:"); System.out.println(linia); plikWyjsciowy.write(linia); } catch (FileNotFoundException fnf) { System.err.println("BŁĄD zapisu! Plik nie znaleziony."); } catch (SecurityException se) { System.err.println("BŁĄD zapisu! Zabroniony dostęp do pliku."); } finally { plikWyjsciowy.close(); } plikWejsciowy.close();}}i wyrzuca mi NullPointException i nie zapisuje do pliku kompletnie nic generalnie polecenie mam takie: Napisz program odczytujący dane z pliku tekstowego (dane.txt), wypisujący ten tekst na ekranie, zamieniający wybrane słowo na inne i ponownie zapisujący ten nowy tekst do innego pliku (wyniki.txt). Edited December 2, 2007 by cloudx Quote Share this post Link to post Share on other sites More sharing options...
thuGG Posted December 2, 2007 Report post Posted December 2, 2007 (edited) Mógłbyś chociaż napisać w której linijce wyrzuca ci NullPointerException. Edited December 2, 2007 by thuGG Quote Share this post Link to post Share on other sites More sharing options...
cloudx Posted December 2, 2007 Report post Posted December 2, 2007 Mógłbyś chociaż napisać w której linijce wyrzuca ci NullPointerException. import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class Pliki { public static void main(String[] args) throws IOException { System.err.println("Tekst, ktory zostal przeczytany z pliku:"); BufferedReader plikWejsciowy = new BufferedReader(new FileReader("dane.txt")); BufferedWriter plikWyjsciowy = null; String linia; int i=0; while (true) { linia = plikWejsciowy.readLine(); if ( linia == null ) break; i++; [b]plikWyjsciowy.write( linia + "\r\n");[/b] } System.out.println(linia); linia = linia.replaceAll("ene", "nic"); try { plikWyjsciowy = new BufferedWriter(new FileWriter("wynik.txt")); System.err.println("Tekst, ktory został zapisany do pliku wynik.txt:"); System.out.println(linia); plikWyjsciowy.write(linia); } catch (FileNotFoundException fnf) { System.err.println("BŁĄD zapisu! Plik nie znaleziony."); } catch (SecurityException se) { System.err.println("BŁĄD zapisu! Zabroniony dostęp do pliku."); } } //plikWejsciowy.close();}Zmieniłam kod troszkę. NullPointer wyrzuca w pogrubionej linii PS. Jestem dziewczyną^^ Quote Share this post Link to post Share on other sites More sharing options...
Prog Posted December 2, 2007 Report post Posted December 2, 2007 Spróbuj poprawnie zainicjalizować zmienną String linia = new String(); NullPointerException często jest wynikiem złej inicjalizacji zmiennych. Quote Share this post Link to post Share on other sites More sharing options...
Yacho Posted December 3, 2007 Report post Posted December 3, 2007 (edited) Totalny brak pomyślunku : Najpierw inicjalizujesz PrintWritera tak : BufferedWriter plikWyjsciowy = null; A potem sie dziwisz ze jest NPE :P:P:P Spróbuj poprawnie zainicjalizować zmienną String linia = new String(); NullPointerException często jest wynikiem złej inicjalizacji zmiennych. Po pierwsze nie zmienna tylko obiekt; Po drugie kod z użytą ale niezainicjalizowaną zmienną nawet sie nie skompiluje. Po trzecie jak najbardziej mozna zapisac null do pliku - a NPE wyskakuje wtedy gdy wartosc null wystepuje podczas runtime tam gdzie nie jest przewidziana. (jako ze domyslnie niezainicjalizowany string jest nullem kazda metoda przyjmujaca string musi nulla obsluzyc.) Edited December 3, 2007 by Yacho Quote Share this post Link to post Share on other sites More sharing options...
PelzaK Posted December 3, 2007 Report post Posted December 3, 2007 (edited) jak zwykle początkujący nie czytają błędów :). Błędy są po to żeby je czytać i poprawiać a nie panikować że nie działa :) Jak piszę koda w pracy to nieraz mam z 500 błędów, które zazwyczaj wynikają z prozaicznego niedomkniętego nawiasu - i co mam panikować? Czytam co pisze do mnie kompiltor czy linker, patrzę w której linijce i po problemie. Rzadko zdarzają się błędy, w których nie wiadomo o co chodzi. Do tego ludzie.. nauczcie się korzystac z debugera - bez tego nei da się pisać sensownych programów. :) Po pierwsze nie zmienna tylko obiekt; Po drugie kod z użytą ale niezainicjalizowaną zmienną nawet sie nie skompiluje. no to zmienną czy obiektem.. z tego co się orientuję to w javuni wszystko jest obiektem :) a skoro poprawiasz poprzednika że string to nie zmienna a obiekt, to o jakich zmiennych Ty mówisz :wink: Edited December 3, 2007 by PelzaK Quote Share this post Link to post Share on other sites More sharing options...
Yacho Posted December 4, 2007 Report post Posted December 4, 2007 (edited) W javie są zmienne prymitywne (primitive types) ale string do nich NIE NALEZY. Zauwaz ze inicjalizujac stringa piszesz : String s = "DupawKwiatach";a inta tak : int i = 10; String jest z dużej litery ponieważ jest klasą stąd jej instancje to obiekty. Primitive types działąją jak w innych językach - gdy chcemy uzyc bardziej zaazansowanych opcji reprezentacji typu prostego używamy klas opakowujących (wrapper classes) naprzykład : Integer, Double, Float itp. Roznica pomiedzy zmienną typu prymitywnego a referencja wskazujaca na obiekt jest taka ze ta druga jesli nie zostanie zainicjalizowana wskazuje zawsze na null. stąd Stringa inicjalizować nie trzeba, natomiast zmienne typów prostych wypada (choc w pewnych momentach przyjma one wartosci domyslne chyba ale nei jestem pewien wiec mieszac nie bede :) ) Edited December 4, 2007 by Yacho Quote Share this post Link to post Share on other sites More sharing options...
Ragnor Posted December 4, 2007 Report post Posted December 4, 2007 (edited) W javie są zmienne prymitywne (primitive types) ale string do nich NIE NALEZY. Zauwaz ze inicjalizujac stringa piszesz : String s = "DupawKwiatach";a inta tak : int i = 10; String jest z dużej litery ponieważ jest klasą stąd jej instancje to obiekty. Primitive types działąją jak w innych językach - gdy chcemy uzyc bardziej zaazansowanych opcji reprezentacji typu prostego używamy klas opakowujących (wrapper classes) naprzykład : Integer, Double, Float itp. Roznica pomiedzy zmienną typu prymitywnego a referencja wskazujaca na obiekt jest taka ze ta druga jesli nie zostanie zainicjalizowana wskazuje zawsze na null. stąd Stringa inicjalizować nie trzeba, natomiast zmienne typów prostych wypada (choc w pewnych momentach przyjma one wartosci domyslne chyba ale nei jestem pewien wiec mieszac nie bede :) ) Rozpisałeś się, chciałeś wytchnąć innym błędy, lecz w swym wytłumaczeniu sam błędy popełniłeś. To jak zostanie zainicjowana zmienna (prymityw) lub referencja zależy od zakresu w którym pojawi się definicja. Jeśli definicja zmiennej, referencji pojawi się w zakresie obiektu/klasy to działa to tak że referencja jest ustawiana na null a zmienna (typ prosty) na domyślną wartość np. dla bool to false. Lecz gdy definiujesz zmienna, referencję w zakresie lokalnym (w metodzie) wtedy nie są nadawane wartości domyślne ani null i nie można użyć takiej zmiennej, referencji bez wcześniejszego przypisania jakieś wartości. Dla przykłady takie coś się nie skompiluje w ogóle: public class Example { public static void main(String [] args) { Object o; if (o == null) { System.out.println("Jestem null"); } else { System.out.println("Kim ja jestem?"); } }} Edited December 4, 2007 by Ragnor Quote Share this post Link to post Share on other sites More sharing options...
PelzaK Posted December 4, 2007 Report post Posted December 4, 2007 to ze zmienne referencyjne wymagają inicjalizacji to już jest od czasów C++ :). Wydawało mi się, że typy proste w javie są aliasami na obiekty, jak to ma miejsce w .necie Quote Share this post Link to post Share on other sites More sharing options...
Ragnor Posted December 5, 2007 Report post Posted December 5, 2007 to ze zmienne referencyjne wymagają inicjalizacji to już jest od czasów C++ :). Wydawało mi się, że typy proste w javie są aliasami na obiekty, jak to ma miejsce w .necie Własnie tak nie jest, typy proste w javie nie są obiektami (ich "klasy" nie dziedziczą po Object). Elementy typów prostych są tworzone na stosie a nie jak obiekty na stercie. Przekazywanie typów prostych odbywa się przez kopiowanie wartości (w końcu element znajduje się na stosie) a nie jak w przypadku obiektów kopiowanie referencji. Z tego co się orientuje zostało to tak zaimplementowane z powodów wydajnościowych, obsługa stosu jest o wiele szybsza niż alokowanie pamięci na stercie. To, że w javie typów prostych i klas opakowujących można od wersji 5.0 używać zamiennie (jak metoda potrzebuje Integer można spokojnie dać jej int i na odwrót) wynika z wprowadzonych mechanizmów autoboxing i autounboxing. Quote Share this post Link to post Share on other sites More sharing options...