2017-08-26 2 views
-1

BufferedInputStream#mark(int) La fonction obtient comme argument la limite des octets qui peuvent être lus, une fois lus, la marque devient invalide.Pourquoi BufferedInputStream # reset() n'a pas levé RuntimeException?

Dans la marque livre OCP (int) est décrit comme:

... vous pouvez appeler marque (int) avec une valeur limite de lecture anticipée. Vous pouvez ensuite lire autant d'octets que vous le souhaitez jusqu'à la valeur limite.

Ainsi, le code ci-dessous met en valeur limite à 1 octet, après avoir lu cet octet, la marque doit être invalidée et appelant la fonction .Reset() devrait lancer une RuntimeException, mais il ne se produit pas. Est-ce la JVM qui est en quelque sorte en train de passer outre l'argument passé pour marquer la fonction?

public class Main { 


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

    Path path = Paths.get("Java8_IOandNIO\\src\\main\\resources\\abcd.txt"); 

    File f = new File(path.toString()); 

    FileInputStream fis = new FileInputStream(f); 
    BufferedInputStream bis = new BufferedInputStream(fis); 

    bis.mark(1); 

    System.out.println((char) bis.read()); 
    System.out.println((char) bis.read()); 
    System.out.println((char) bis.read()); 

    bis.reset(); 

    System.out.println("called reset"); 

    System.out.println((char) bis.read()); 
    System.out.println((char) bis.read()); 
    System.out.println((char) bis.read()); 
    } 
} 

Le code à chaque fois imprime les données à partir du fichier échantillon:

A 
B 
C 
called reset 
A 
B 
C 

Répondre

1

Eh bien, la documentation (contrat original de InputStream) déclare:

Si la marque de la méthode n'a pas a été appelé depuis la création du flux, ou le nombre d'octets lus depuis le flux depuis que la dernière marque a été appelée est plus grand que l'argument à marquer lors de ce dernier appel, alors une exception IOException pourrait être être jeté.

(Non souligné)

Cela signifie que la limite est fixée à une recommandation . Il n'est pas obligatoire que la marque soit invalidée après que le nombre d'octets ait été lu.

0

Parce que:

  • l'OCP ne vous cité dit rien de jeter un RuntimeException;
  • il ne dit pas que vous ne pouvez pas nécessairement lire plus;
  • l'OCP n'est pas une référence normative;
  • le real normative reference ne le dit pas non plus; et
  • le flux est tamponné, de sorte qu'il peut supporter une marque jusqu'à sa taille de tampon interne, qui est actuellement 8192 octets.
+0

@downcoter Lequel de ces cinq énoncés est incorrect? – EJP