2017-05-21 2 views
0

Je rencontre un problème concernant la fonction de marquage de la classe Buffer de l'API Java NIO. J'essaie d'exécuter quelques exemples en utilisant un ByteBuffer, qui hérite de la fonctionnalité de marquage de la classe parent Buffer.Marquage de tampon en Java NIO

L'exemple que je veux réaliser est d'avoir "AwesomeSauce" comme une sortie d'abord suivie par "Sauce", en utilisant la fonctionnalité de marquage. Le code est ci-dessous:

public class MarkingNIO { 

public static void main(String[] args) { 
    ByteBuffer buffer = ByteBuffer.allocate(20); 
    byte byteArray[]; 

    buffer.put("AwesomeSauce".getBytes()); 

    int prevPos = buffer.position(); 
    buffer.position(7).mark().position(prevPos); //Mark position 7 and revert back so that we can flip 
    buffer.flip(); 

    byteArray = new byte[buffer.limit() - buffer.position()]; 

    for (int i = 0; buffer.hasRemaining(); i++) { 
     byteArray[i] = buffer.get(); 
    } 

    System.out.println("Whole string: " + new String(byteArray)); 

    buffer.reset(); 

    byteArray = new byte[buffer.limit() - buffer.position()]; 

    for (int i = 0; buffer.hasRemaining(); i++) { 
     byteArray[i] = buffer.get(); 
    } 

    System.out.println("Partial String" + new String(byteArray)); 
} 
} 

La sortie pour moi est comme suit:

AwesomeSauce 
Exception in thread "main" java.nio.InvalidMarkException 
    at java.nio.Buffer.reset(Buffer.java:306) 
    at markingnio.MarkingNIO.main(MarkingNIO.java:37) 
Java Result: 1 

Les points d'erreur à la méthode de réinitialisation.

EDIT: Je l'ai fait pour tester les méthodes mark() et reset() à des fins d'apprentissage. De toute façon, le problème était que la méthode flip() avait une déclaration de "mark = -1", et la position (int) avait une déclaration de "if (mark> position) mark = -1;"

+0

Vous n'avez pas besoin de toute cette complication. Utilisez simplement 'get (int index)' directement. – EJP

+0

Je le fais à des fins d'apprentissage. –

Répondre

0

regard sur cette ligne:

buffer.flip(); 
public final Buffer flip() { 
    limit = position; 
    position = 0; 
    mark = -1; 
    return this; 
} 

cet appel = -1 placer la marque, et voir des instruments de méthode reset():

public final Buffer reset() { 
    int m = mark; 
    if (m < 0) 
     throw new InvalidMarkException(); 
    position = m; 
    return this; 
} 

la remise à zéro jetteront InvalidMarkException alors que marque = -1;

vous pouvez le supprimer: buffer.position(7).mark().position(prevPos);, et changer le buffer.reset(); dans buffer.position(7);

+0

Eh bien, je faisais cela pour tester la fonctionnalité de marquage et de réinitialisation. De toute façon, votre commentaire m'a aidé car je n'ai pas remarqué que la méthode flip avait la marque = -1. Je vous remercie! –

+0

Ce n'est pas une bonne idée de s'appuyer sur l'implémentation, car le code changera avec le temps. Ce qui restera stable pour chaque future version de Java, cependant, c'est la [documentation] (https://docs.oracle.com/javase/8/docs/api/java/nio/Buffer.html#flip--), qui états: "Si la marque est définie, alors il est jeté." – VGR