|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
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
Sources en rapport avec celle ci
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
|
Téléchargements
Logiciels à télécharger sur le même thème :
|