2 votes

Java - est-il possible de lire un fichier ligne par ligne, de s'arrêter, puis de recommencer immédiatement à lire les octets là où je me suis arrêté ?

J'ai un problème en essayant d'analyser la partie ascii d'un fichier, et une fois que j'ai atteint la balise de fin, je commence IMMÉDIATEMENT à lire les octets à partir de ce point. Tout ce que je sais en Java pour lire une ligne ou un mot entier crée un tampon, ce qui ruine toute chance d'obtenir les octets suivant immédiatement mon point d'arrêt. La seule façon de procéder est de lire octet par octet, de trouver les nouvelles lignes, de reconstruire tout ce qui précède la nouvelle ligne, de voir s'il s'agit de ma balise de fin et de continuer à partir de là ?

2voto

Marian Points 968

C'est possible, mais pour autant que je sache, pas avec les classes de l'API.

Vous pouvez le faire manuellement - l'ouvrir comme une BufferedInputStream qui soutient mark / reset . Vous lisez bloc par bloc ( byte[] ) et vous l'analysez comme ASCII. Finalement, vous l'accumulez dans un tampon jusqu'à ce que vous atteigniez le marqueur. Mais avant que vous read vous appelez mark . Si vous pensez avoir lu tout ce dont vous aviez besoin en ASCII, vous appelez reset et ensuite vous appelez read pour vider le reste de la partie ASCII. Et maintenant vous avez un BufferedInputStream (qui est un InputStream ) prêt à lire la partie binaire du fichier.

2voto

Michael Borgwardt Points 181658

Je pense que la meilleure idée serait d'abandonner le concept de "lignes". Pour trouver la balise de fin, créez un tampon circulaire qui est juste assez grand pour contenir la balise de fin, lire dedans octet par octet, et après chaque octet vérifier s'il contient la balise.

Il existe des algorithmes de recherche plus sophistiqués et plus efficaces, mais la différence n'est pertinente qu'avec des termes de recherche plus longs (on peut supposer que votre balise de fin est courte).

1voto

Alan Moore Points 39365

Quelle est la taille de ce fichier ? Ma première idée est de lire l'ensemble du fichier dans un ByteBuffer ou un ByteArrayOutputStream sans essayer de le traiter, puis de localiser la balise en comparant les valeurs des octets. Une fois que vous savez où se termine la partie texte et où commence la partie binaire, vous traitez chaque partie comme il convient.

0voto

Oui, tu as raison pour l'octet par octet. L'abstraction a ses inconvénients.

0voto

mikaelhg Points 647

Le fichier est-il en croissance ou statique ?

Si c'est statique, voir http://java.sun.com/javase/6/docs/api/java/nio/MappedByteBuffer.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X