Metoda mark() klasy BufferedInputStream po przeniesieniu do dalszej linie przestaje działać

0

Witam. Dlaczego gdy użyje metody mark() BufferedInputStream po użyciu metody read() to nie można przenieść się do miejsca wskazanego w argumencie mark().

Ten kod działa zgodnie z przewidywaniami:

   public static void main(String[] args) throws FileNotFoundException, IOException {
        File plik=new File("strumieniebajt.txt");
        plik.createNewFile();
        
        BufferedOutputStream zapis=new  BufferedOutputStream(new FileOutputStream(plik));  // Zapis do pliku
        
        zapis.write(1);
        zapis.write(2);
        zapis.write(3);
        zapis.close();

      
      BufferedInputStream odczyt = new BufferedInputStream(new FileInputStream(plik));// odczyt z pkiku

        odczyt.mark(0);  // Gdy metoda jest w tym miejscu wszystko działa poprawnie 
         
        System.out.println(odczyt.read());
        System.out.println(odczyt.read());
        odczyt.reset();
        System.out.println(odczyt.read());
}}
 

Wynikiem jest ciąg "1 2 1" czyli poprawnie.

Kod stwarzający problemy, z użyciem metody mark() już po wywołaniu metody read():

public class Strumienie {

   
    public static void main(String[] args) throws FileNotFoundException, IOException {
        File plik=new File("strumieniebajt.txt");
        plik.createNewFile();
        
        BufferedOutputStream zapis=new  BufferedOutputStream(new FileOutputStream(plik));
        
        zapis.write(1);
        zapis.write(2);
        zapis.write(3);
        zapis.close();

      
      BufferedInputStream odczyt = new BufferedInputStream(new FileInputStream(plik));
        
         
        System.out.println(odczyt.read());
        System.out.println(odczyt.read());

        odczyt.mark(0); // Tutaj metoda mark po pierwszył wywołaniu read(), już nie działa metoda reset()
        odczyt.reset();

        System.out.println(odczyt.read());
 

Wynikowy ciąg to "1 2 3", tak jak bym w ogóle nie użył metod mark() oraz reset().
Co jest tego przyczyną?

0

Do dokumentacji zajrzałeś?

public void mark(int readlimit)

Marks the current position in this input stream.
public void reset() throws IOException

Repositions this stream to the position at the time the mark method was last called on this input stream.

0

Tak zaglądałem, nic nie wywnioskowałem (może to przez jeszcze słaby angielski), książka Java. Kompendium programisty. Wydanie VII też mi nie podsunęła żadnego rozwiązania, tu może czegoś nie załapałem, w google też nic konkretnego nie znalazłem. Mógł byś mi wyjaśnić czego nie rozumiem?

1

Metoda mark zaznacza aktualną pozycję (argument nie ma wpływu na to co jest zaznaczone). Metoda reset wraca do miejsca, w którym ostatnio była wywołana metoda mark. Zatem kod

odczyt.mark(cokolwiek); 
odczyt.reset();

nie ma żadnego wpływu na zachowanie programu, "jest, a jakoby go nie było".

0

Dzięki

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