BufferedReader czyta co 2 linie

0

Program sczytuje co 2 linie, W dokumencie txt mam "1linijka
2linijka
3linijka
4linijka
5linijka
6linijka
"

program wyświetla tylko: 2linijka
4linijka
6linijka
Orientuje się ktoś w czym tkwi problem?

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Czytaj {

	public static void main(String[] args) throws IOException {

			 BufferedReader br=new BufferedReader (new FileReader("tekst.txt"));
		
			 String zd;
			 while((zd = br.readLine()) != null)
			 {	
			         zd = br.readLine();  
			         System.out.println(zd);
		   
			 }
			 br.close();	
	    }
	    
}
2
             while((zd = br.readLine()) != null) //tu czytasz wiersz i nic z nim nie robisz
             {    
                     zd = br.readLine(); //tu czytasz następny wiersz

Czyli, czytasz wszytskie wiersze, ale wypisujesz co drugi.

0

:D wielkie dzięki, jakimś cudem to przegapiłem

@bogdans a tak przy okazji, gdybym chciał dostać się tylko i wyłącznie do np. piątego wiersza to da się to jakoś zrobić? Czy muszę skanować wszystko do 5 miejsca i dodać to do np. kolekcji?

0

Dostęp do pliku jest chyba tylko sekwencyjny.

0

Po czym chcesz poznać, że już jesteś w piątym wierszu? Musisz czytać plik od początku i liczyć znaki nowego wiersza.

0

jeśli masz wpływ na strukturę pliku to możesz w tym samym pliku lub plik obok dodać indeks - mapowanie linijki na offset w którym się zaczyna - jeśli chcesz 140 linijkę to czytasz 140-te słowo i dajesz seek w tę pozycję. indeksowanie potrwa tyle co przeczytanie całego pliku i musisz go odbudowywać za każdym razem kiedy plik tekstowy się zmieni, ale potem możesz skakać po linijkach czytając tylko tyle ile potrzebujesz (w uproszczeniu bo tak naprawdę z dysku zostanie i tak przeczytany co najmniej cały sektor)

0
bogdans napisał(a):

Po czym chcesz poznać, że już jesteś w piątym wierszu? Musisz czytać plik od początku i liczyć znaki nowego wiersza.

niby gdybym potrzebował tylko n tego wiersza to mógłbym zrobić tak:

 while((zd = br.readLine()) != null)
			 { 
			       i++;
			       
			         if(i>=5)
			         { 
			        	 System.out.println(zd);
			        	 break; 
			         }
			 }

wada jest taka, że nie mam dostępu do poprzednich wierszy i też chyba nie bardzo mam jak do nich wrócić.
Ale teraz już widzę, że najlepiej sczytać wszystkie wiersze i zapisać do kolekcji.

0

@pijany krawiec napisał

Ale teraz już widzę, że najlepiej sczytać wszystkie wiersze i zapisać do kolekcji.

Zgoda, można to zrobić np. tak:

ArrayList<String> lines = (ArrayList<String>)Files.lines(Paths.get(fileName)).collect(Collectors.toList());

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