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
TECHDAYS PARIS 2010 : SHAREPOINT 2010 POUR LES DéVELOPPEURSTECHDAYS PARIS 2010 : SHAREPOINT 2010 POUR LES DéVELOPPEURS par ROMELARD Fabrice
Animé par: Laurent Cotton Le développement dans SharePoint 2010 passe par plusieurs axes qui seront évoqués dans cette session, mais plus particulièrement les développements simples lié au besoin Business Business Connectivity Services Ce BCS es...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOURTECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOUR par ROMELARD Fabrice
Cette session est la dernière pleinière de ces 3 jours de TechDays Paris 2010. Généralement, cette troisième journée est plus axée sur l'avenir vu par Microsoft. Après un retour sur l'avenir vu par la Science Fiction ou par ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
Comparez les prix

HTC Magic
Entre 429€ et 429€
|