2010-03-08 3 views
3

Comment obtenir une position dans le fichier (octet-position) du scanner Java?Comment obtenir une position dans un fichier (position d'octet) à partir d'un scanner Java?

Scanner scanner = new Scanner(new File("file")); 
scanner.useDelimiter("abc"); 
scanner.hasNext(); 
String result = scanner.next(); 

et maintenant: comment obtenir la position du résultat dans le fichier (en octets)? L'utilisation de scanner.match(). Start() n'est pas la réponse, car elle donne la position dans le tampon interne.

Répondre

2

Scanner fournit une abstraction sur le Readable sous-jacent, dont le contenu ne doit pas nécessairement provenir d'un File. Il ne prend pas directement en charge le type de requête de bas niveau que vous recherchez.

Vous pouvez être en mesure de calculer ce nombre en combinant la position de tampon interne selon le Scanner et le nombre d'octets lus selon le Readable, mais même cela semble être une proposition difficile. Si un emplacement approximatif dans un fichier volumineux est acceptable, cela peut suffire.

4

Son possibe en utilisant RandomAccessFile .. essayer ..

+0

Ok, mais avec RandomAccessFile je ne peux pas utiliser les expressions régulières d'une manière aussi facile qu'avec le scanner ... –

+0

c'est juste! mais une façon de faire est de lire toutes les lignes, de le stocker dans une chaîne et d'utiliser regEx dans la chaîne .. Je sais! Cela semble très mauvais! :) – raj

+0

c'est impossible - mes fichiers sont trop gros pour le lire à la fois –

1

Vous pouvez obtenir une position approximative du fichier à l'aide d'un FileInputStream personnalisé pour créer le scanner, comme ceci:

final int [] aiPos = new int [1]; 
FileInputStream fileinputstream = new FileInputStream(file) { 
    @Override 
    public int read() throws IOException { 
     aiPos[0]++; 
     return super.read(); 
    } 
    @Override 
    public int read(byte [] b) throws IOException { 
     int iN = super.read(b); 
     aiPos[0] += iN; 
     return iN; 
    } 
    @Override 
    public int read(byte [] b, int off, int len) throws IOException { 
     int iN = super.read(b, off, len); 
     aiPos[0] += iN; 
     return iN; 
    } 
}; 

Scanner scanner = new Scanner(fileinputstream); 

Cette volonté vous donne une position précise à 8K près, en fonction de l'implémentation de FileInputStream. Ceci est utile pour des choses comme la mise à jour des barres de progression pendant une analyse de fichier, où vous n'avez pas besoin de la position exacte, juste quelque chose de raisonnablement proche.

Questions connexes