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à ?
Réponses
Trop de publicités?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.
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).
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.
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