Jump to content
cloudx

[java] Odczyt Linii W Pliku

Recommended Posts

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();}}

Share this post


Link to post
Share on other sites

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 by cloudx

Share this post


Link to post
Share on other sites

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ą^^

Share this post


Link to post
Share on other sites

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 by Yacho

Share this post


Link to post
Share on other sites

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 by PelzaK

Share this post


Link to post
Share on other sites

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 by Yacho

Share this post


Link to post
Share on other sites

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 by Ragnor

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...


×
×
  • Create New...