InputStream, mark (), reset ()
Comment sont mark()
et reset()
méthodes de travail exactement(dans le code ci-dessous), étape par étape ? J'ai essayé d'écrire mon propre exemple mais commence à jeter des mauvais exception de la marque ou semblable à cela, et je ne comprends pas quel est le point de placer la marque et de réinitialiser les méthodes de ce code, car je ne vois pas de différence avec cette ou sans.
import java.io.*;
class BufferedInputStreamDemo {
public static void main(String args[]) {
String s = "© is a copyright symbol, "
+ "however © 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);
}
}
}
source d'informationauteur ashur
Vous devez vous connecter pour publier un commentaire.
Quand
f.mark(32);
est atteinte, la lecture curseur est déjà à l'après&
et un marqueur est défini pourreset
de savoir par où revenir. Ainsi, lorsque vous avez détecté un;
est manquant pour fermer l'élément, vous êtes manuellement l'impression&
et le déplacement de la lecture du curseur vers la droite en arrière (après&
où le marqueur est placé, à l'aide de lamark(32)
appel), en utilisant lareset
méthode. Sur la lecture suivante, parce que votremarked
variable n'est pas définie, il permet d'imprimer les caractères.mark(32)
moyen de supprimer automatiquement le marqueur si votre lire curseur avance plus de 32 caractères. Cela peut être le problème dans votre code, c'est le déclenchement d'une erreur, parce que le marqueur a été invalidé déjà.Voir la documentation de l'API:
marque(int)
reset()