Accueil > > > CHUNKEDXML, LIRE DU XML PAR MORCEAU
CHUNKEDXML, LIRE DU XML PAR MORCEAU
Information sur la source
Description
Cette classe à pour vocation de fournir une fonctionnalité légère pour la lecture de gros flux XML Certains flux xml (notamment ceux utilisés par mes script de collecte de données) peuvent être très volumineux (20 à 100 Mo, quand c'est pas du Go). Leur lecture par des procédés classiques : - SAX and Co - analyse par expression rationnelle de la globalité du flux présent en mémoire fait souvent déborder la mémoire (Heap Space). L'idée est donc de fournir un service de lecture de ces flux par morceau (chunk), afin de limiter la consommation de mémoire et surtout de permettre la lecture complète du flux sans faire tomber le script en dépassement de capacité mémoire (Heap Overflow)
Source
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* Cette classe à pour vocation de fournir une fonctionnalité légère pour la lecture de gros flux XML.
* Certains flux xml (notamment ceux utilisés par mes script de collecte de données)
* peuvent être très volumineux (20 à 100 Mo, quand c'est pas du Go).
* <br/>
* Leur lecture par des procédés classiques :
* <ul>
* <li>SAX and Co</li>
* <li>analyse par expression rationnelle de la globalité du flux présent en mémoire</li>
* </ul>
* fait souvent déborder la mémoire (Heap Space).
* <br/>
* L'idée est donc de fournir un service de lecture de ces flux par morceau (chunk),
* afin de limiter la consommation de mémoire et surtout de permettre la lecture complète du flux
* sans faire tomber le script en dépassement de capacité mémoire (Heap Overflow)
* <br/>
* 1) Principe de fonctionnement de cette classe :
* <br/><br/>
* On instancie un objet de la classe en fournissant :
* <br/>
* <ul>
* <li>le nom du fichier XML à morceler</li>
* <li>le texte de la balise qui va délimiter les morceaux</li>
* </ul>
* L'instanciation, vérifie l'existence du flux et prépare sa lecture.
* <br/><br/>
* 2) On appelle la méthode getNextChunk() chaque fois qu'on veut un morceau du flux.
* La méthode répondra par une chaîne correspondant au morceau suivant ou null lorsqu'elle est arrivée en fin de flux.
* <br/><br/>
* Dans un premier temps, il s'agit de permettre la lecture de fichiers locaux téléchargés manuellement.
* Mais l'idéal serait de permettre le téléchargement du flux depuis son url d'origine, sa décompression et sa lecture.
* <br/><br/>
* @author AlexN
*
*/
public class ChunkedXML {
// Propriétés de construction
private String filename; // nom du fichier (ou url (TODO))
private String delimiter; // texte non xml de la balise délimitant les morceaux
// Propriétés internes
private Boolean isValid; // indicateur si le nom de fichier ou l'url fournie correspond à une ressource disponible
private File file; // objet fichier pour la lecture par morceaux
private FileInputStream stream; // flux de lecture
/**
* Point d'entrée du programme de test
* @param args
*/
public static void main(String[] args) {
ChunkedXML myXML = new ChunkedXML("my.xml", "chunck");
String chunk;
while ((chunk = myXML.getNextChunk()) != null) {
System.out.println(chunk.length() + " " + chunk);
chunk = null; // Déréférencement des données pour aider le Garbage Collector
}
}
/**
* Constructeur de ChunkedXML
*
* @param filename : nom du fichier
* @param delimiter : texte brut de la balise de délimitation "balise" et non "</balise>".
* Le delimiteur n'a pas besoin d'être capitalisé (compareIgnoreCase() pour la recherche du délimiteur)
*/
public ChunkedXML(String filename, String delimiter) {
this.filename = filename;
this.delimiter = delimiter;
this.isValid = isValid(); // vérification de la validité du flux et préparation de sa lecture
}
/**
* Verifie que les paramètres du constructeur sont valides
*
* @return : vrai ou faux selon le résultat des tests
*/
private Boolean isValid() {
if (this.filename == null) {
System.err.println("La référence au fichier est nulle : WTF ???");
return false;
}
this.file = new File(this.filename);
// Le fichier existe-t-il et est-il lisible ?
if(!this.file.canRead()) {
System.err.println("Je ne peux pas lire le fichier (introuvable ou illisible) : " + this.filename);
return false;
}
// Le fichier contient-il quelquechose ?
if(this.file.length() == 0L) {
System.err.println("Le fichier est vide : " + this.filename);
return false;
}
// Préparation du flux de lecture
try {
this.stream = new FileInputStream(this.file);
} catch(FileNotFoundException e){
System.err.println("Je ne peux pas convertir le fichier en flux de lecture : " + this.filename);
return false;
}
// Tout semble ok
return true;
}
/**
* Méthode pour savoir s'il reste des caractères disponibles dans le flux xml
*
* @return vrai ou faux selon qu'il reste des caractères dans le flux xml
*/
public boolean isAvailable() {
try {
return (this.stream.available() > 0);
} catch(IOException e) {
return false;
}
}
/**
* Lit un morceau du flux xml et s'arrête au délimiteur
*
* @return le morceau de flux xml qui a été lu.
*/
public String getNextChunk() {
try {
if (!this.isValid || this.stream.available() <= 0) return null;
StringBuffer tag = new StringBuffer();
ByteArrayOutputStream baos = new ByteArrayOutputStream((int)this.file.length());
boolean inTag = false;
while (true) {
int byteRead = this.stream.read();
if (byteRead < 0) break;
if (byteRead == '<') {
inTag = true;
tag = new StringBuffer();
tag.append((char)byteRead);
} else if (inTag) {
if (byteRead != ' ') tag.append((char)byteRead); // Ignorer les espaces
if (byteRead == '>') {
inTag = false;
StringBuffer xmlTag = new StringBuffer("</");
xmlTag.append(this.delimiter);
xmlTag.append(">");
if (tag.toString().equalsIgnoreCase(xmlTag.toString())) {
baos.write(byteRead);
break;
}
}
}
baos.write(byteRead);
}
baos.flush();
String chunk = new String(baos.toByteArray());
baos.close();
baos = null; // Déréférencement des données pour aider le Garbage Collector
return chunk;
} catch(IOException e) {
System.err.println("Problème IO lors de la lecture du flux");
}
return null;
}
}
Conclusion
Fichier d'exemple (my.xml) :
<root>
<chunck> <data1>this is the data 1 for chunk 1</data1> <data2>this is the data 2 for chunk 1</data2> <data3>this is the data 3 for chunk 1</data3> </chunck> <chunck> <data1>this is the data 1 for chunk 2</data1> <data2>this is the data 2 for chunk 2</data2> <data3>this is the data 3 for chunk 2</data3> </chunck> <chunck> <data1>this is the data 1 for chunk 3</data1> <data2>this is the data 2 for chunk 3</data2> <data3>this is the data 3 for chunk 3</data3> </chunck> <chunck> <data1>this is the data 1 for chunk 4</data1> <data2>this is the data 2 for chunk 4</data2> <data3>this is the data 3 for chunk 4</data3> </chunck> </root>
Historique
- 27 juin 2008 17:39:04 :
- Beh koi ? Faut-il tout le temps se justifier ('tain de monde numérique)
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Parser un fichier XML avec un schéma donné [ par biniouman ]
Bonjour,Je cherche à parser avec jaxp et sax un fichier xml en fonction d'un schéma. Mon fichier est tout bete, mais je ne sais pas par où commencer S
parseur XML [ par haineT ]
Salut a tous,1er prog en java, 1er probleme et donc premier post :). Je suis developpeur flash, et je voudrais elargir mes connaissances sur java. J'a
Mise e forme d'un fichier des info retirer a l'aide d'un Parser xml [ par Caralho27 ]
J'effectuen un parsing sur plusieurs fichiers à l'aide d'un programme JAVA mais il me faudrait mettre les valeurs que g rechercher dans un tableau.Je
Parser du xml [ par Mikonyx ]
Salut, J'ai besoin de parser du xml mais, ne voulant pas obliger l'utilisateur à installer un parser xerces ou aelfred, je souhaite le faire uniquemen
SWT [ par julio13 ]
Salut à tous,voila ma question :je suis en train de développer un plugin eclipse. Au départ, le plugin est initialisé avec un fichier .xml pour la con
parser xml [ par fredmorvant29 ]
bonjour je veu parser un flux xml pour en retirer les info sous forme de liste.ex: <prod> <nom>toto</nom> <prix>10</p
le XML parser SAX : pb lorsque <balise></balise> [ par Enguerrant ]
hello!voilà, j'utilise SAX pour parser un fichier XML, et çà se passe plutot bien !! sauf lorsque dans le fichier en question, il n'y a, à un endroit
parser du XML en sauver dans une liste [ par damien781 ]
Hello, J'ai un fichier XML sous cette forme (pour implémenter une logique plus simple, cette forme peut etre modifier)//dans un tableau/liste ce qui s
Parser XML [ par mlelorra ]
SalutJe voudrais pouvoir parser une grande chaine de caractere avec Dom ou SAX mais il n'accepte que des File, ImputStream, URI...comment faire ?merci
parser xml | Handler | question [ par Yanzisf ]
Bonjour, voici un bout d'un xml que je parse avec SAX : [code] <Tache executable='true'> &nb
|
Derniers Blogs
[SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson
Forum
RE : CODE GéNéRé RE : CODE GéNéRé par Julien39
Cliquez pour lire la suite par Julien39 RE : CODE GéNéRé RE : CODE GéNéRé par Julien39
Cliquez pour lire la suite par Julien39
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|