2009-08-27 10 views
0

J'ai un fichier image personnalisé où le premier bloc de données est méta-données ASCII. Je dois être capable de lire cette partie méta-données ASCII du fichier avec Java et savoir quand elle se termine, et quand les 'données d'image brutes' dans un autre encodage commencent. Je pensais lire tout le fichier dans un octet [], et ensuite commencer à en lire les octets et les convertir en ASCII jusqu'à ce que j'atteigne la fin de la section des méta-données ASCII, à quel point Je stockerais ces données. Ensuite, je pourrais simplement réorganiser les données binaires brutes dans un ordre différent tel quel (aucune lecture nécessaire). Cependant, la seule façon de le faire serait de lire les données ASCII octet par octet et de rechercher de nouvelles lignes, et de tout concaténer avant une nouvelle ligne et de voir si c'est la balise qui signifie le début de la données d'image brutes. Cependant, il doit y avoir une meilleure façon de lire la partie ascii du fichier avec readLine() et ensuite pouvoir commencer immédiatement avec le binaire de l'image brute sans avoir besoin de rouvrir le fichier dans un nouveau lecteur et aller à la ligne où dans le autre lecteur, j'ai trouvé la balise "commencer l'image".Comment puis-je lire proprement un fichier avec ASCII et un autre encodage en Java?

Des idées?

Répondre

1
  • Ouvrez le fichier en tant que FileInputStream (enveloppé dans un BufferedInputStream)
  • Créer une ByteArrayOutputStream
  • Lire l'octet de flux d'entrée par octet, à la recherche de votre tag « commencer l'image » à l'aide d'un string searching algorithm. Cast octets individuels à char (qui est en utilisant ASCII implicitement)
  • En même temps, écrire chaque octet que vous avez regardé dans le ByteArrayOutputStream
  • Une fois que vous avez trouvé la balise, vous pouvez commencer à lire les données d'image de la flux d'entrée
  • Obtenez le tableau d'octets de la ByteArrayOutputStream et le convertir en une chaîne en utilisant new String(array, "US-ASCII");

il pourrait être possible de faire la chaîne de recherche facilement à l'aide d'un Scanner sur le flux d'entrée, mais vous devez faites attention à quel patt Vous l'utiliserez pour vous assurer qu'il trouvera le tag sans commencer à lire les données d'image (puisque vous voulez le lire vous-même dans le flux d'entrée sous-jacent auquel vous conservez une référence distincte). Malheureusement, il semble que Scanner utilise implicitement un tampon, donc il ne reste plus qu'à implémenter la recherche de chaîne "manuellement".

+0

cela fonctionnera-t-il si ma balise "begin image" est réellement celle-ci: {END} Cela serait de 5 octets; cette méthode me permet-elle de rechercher des chaînes de plusieurs octets? – sepiroth

+0

Oui, bien sûr. Cela rend la recherche plus complexe. Regardez la page lings to wikipedia sur les algorithmes de recherche de chaînes, ou utilisez la classe Scanner. –

+0

@michael: J'essaie la route 'scanner' (bien, BufferedReader, de toute façon). J'ai du mal à obtenir FileInputStream pour commencer à saisir des octets où BufferedReader.readLine() est désactivé (je lis la première ligne, puis récupère l'octet suivant, mais l'octet suivant n'est pas correct). Vous avez une idée de ce qui ne va pas? – sepiroth

1

Je ne sais pas si vous pouvez décider le format vous-même, mais de toute façon:

Une stratégie alternative consiste à écrire une valeur entière au premier emplacement du fichier, qui contient le nombre d'octets qui sont utilisés pour la ascii cloison. Ensuite, vous pouvez simplement lire cette quantité d'octets, et il est également possible d'ignorer facilement les ascii et d'aller directement au blob binaire.

Cette stratégie est efficace, mais vous ne pouvez pas modifier la quantité de caractères ASCII sans modifier le nombre. Soit dit en passant, assurez-vous de désinfecter votre entrée: N'essayez pas de lire plus de données puis le fichier contient ou allouer plus de mémoire que la machine est capable de.

Personnellement, j'utiliserais également les deux premiers caractères du fichier pour contenir du code magique, de sorte que vous puissiez avoir une vérification minimale du fait que le fichier utilise votre format de données, et quelle version du format de données.

Questions connexes