J'ai un XML avec le codage UTF8. Et ce fichier contient BOM un début du fichier. Donc, lors de l'analyse, je suis confronté à org.xml.sax.saxparseException: le contenu n'est pas autorisé dans Prolog. Je ne peux pas supprimer ces 3 octets des fichiers. Je ne peux pas charger le fichier dans la mémoire et les supprimer ici (les fichiers sont grands). Donc, pour des raisons de performance, j'utilise Sax Parser et que je veux juste sauter ces 3 octets s'ils sont présents avant "" Tag. Dois-je hériter d'InputStreamreader pour cela? P>
Je suis nouveau en Java - Montrez-moi la bonne façon s'il vous plaît. P>
3 Réponses :
est venu avant, et je l'ai trouvé La réponse sur la pile débordement quand il m'est arrivé. La réponse liée utilise un pushbackinputtream code> pour tester la nomenclature. P>
J'ai connu le même problème et j'ai résolu ce code:
private static InputStream checkForUtf8BOM(InputStream inputStream) throws IOException { PushbackInputStream pushbackInputStream = new PushbackInputStream(new BufferedInputStream(inputStream), 3); byte[] bom = new byte[3]; if (pushbackInputStream.read(bom) != -1) { if (!(bom[0] == (byte) 0xEF && bom[1] == (byte) 0xBB && bom[2] == (byte) 0xBF)) { pushbackInputStream.unread(bom); } } return pushbackInputStream; }
Ceci est pour UTF8 ... J'assume UTF16 différerait (je crois que ses seulement 2 octets)?
Désolé pour le retard. Oui, UTF16 a BOM avec seulement deux octets: 0xfe 0xFF (Big-Endian) ou 0XFF 0XFE (Petit-Endian).
// xml can be read from a file, url or string through a stream URL url = new URL("some xml url"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(url.openStream())); removeBOM(bufferedReader);
Dupliqué possible de Marquage d'ordre d'octets vis de fichiers lecture en Java a>