InputStream, mark (), reset ()

In che modo i metodi mark() e reset() funzionano esattamente (nel codice sotto), passo dopo passo? Ho provato a scrivere il mio esempio ma inizia a generare un’eccezione di segno sbagliato o simile, e non riesco a capire quale sia il punto di mettere i metodi mark e reset in questo codice perché non vedo differenze con questo o senza.

 import java.io.*; class BufferedInputStreamDemo { public static void main(String args[]) { String s = "© is a copyright symbol, " + "however &copy isn't.\n"; byte buf[] = s.getBytes(); ByteArrayInputStream in = new ByteArrayInputStream(buf); int c; boolean marked = false; //try_with_resources try (BufferedInputStream f = new BufferedInputStream(in)) { while ((c = f.read()) != -1) { switch (c) { case '&': if (!marked) { f.mark(32); marked = true; } else { marked = false; } break; case ';': if (marked) { marked = false; System.out.print("(c)"); } else System.out.print((char) c); break; case ' ': if (marked) { marked = false; f.reset(); System.out.print("&"); } else System.out.print((char) c); break; default: if (!marked) System.out.print((char) c); break; } } } catch (IOException e) { System.out.println("I/O Error: " + e); } } } 

Quando f.mark(32); è raggiunto il cursore di lettura è già dopo & , e un marcatore è impostato per reset per sapere dove tornare indietro. Quindi, quando hai rilevato che a ; manca per chiudere l’elemento, si sta manualmente stampando e spostando il cursore di lettura indietro (dopo & dove è stato posizionato il marker, usando la chiamata mark(32) ), usando il metodo reset . Alla prossima lettura, poiché la variabile marked non è impostata, stamperà i caratteri.

mark(32) significa rimuovere automaticamente il marker se il cursore di lettura avanza più di 32 caratteri. Questo potrebbe essere il problema nel tuo altro codice, che sta causando un errore, perché il marcatore è già stato invalidato.

Vedi la documentazione dell’API:

mark(int)

Segna la posizione corrente in questo stream di input. Una successiva chiamata al metodo reset riposiziona questo stream nell’ultima posizione contrassegnata in modo che le letture successive rileggano gli stessi byte.

L’argomento readlimit indica a questo stream di input di consentire la lettura di molti byte prima che la posizione del segno venga invalidata.

Questo metodo esegue semplicemente in.mark (readlimit).

reset()

Riporta questo stream alla posizione nel momento in cui il metodo mark è stato chiamato per ultimo su questo stream di input.

Questo metodo esegue semplicemente in.reset ().

I segni di stream sono pensati per essere utilizzati in situazioni in cui è necessario leggere un po ‘più avanti per vedere cosa c’è nel stream. Spesso questo è fatto più facilmente invocando un parser generale. Se il stream è del tipo gestito dall’analisi, si limita a camminare felicemente. Se lo stream non è di quel tipo, il parser dovrebbe lanciare un’eccezione quando fallisce. Se questo accade entro readlimit bytes, permette al codice esterno di resettare il stream e provare un altro parser.