Bonjour, je suis en train de réaliser un parseur de fichiers HTML pour extraire des informations d'une banque de fichiers HTML. J'ai créé un programme qui lit une liste de fichier et traite chaque fichier par ma fonction de parsing.
Mon parseur lit des fichiers dont la taille varie entre 30ko et 250ko pour extraire des informations de la partie body du document qui tient sur une longue ligne.
Pour faire ca j'utilise un scanner pour lire le fichier ligne par ligne. Jusque là tout va bien sauf que pour certains fichiers la lecture s'arrête au bout d'un certain nombre d'octets inférieur à la taille sans que je sache pourquoi.
La taille tronquée est variable selon les fichiers.
Ce phénomène est reproductible: si je relance le programme, ce sont toujours les même fichiers qui sont tronques et a la même taille.
Mes autres logiciels ouvrent les fichiers sans problème.
Utiliser un FileReader a la place ne change rien donc ça ne vient pas du scanner.
Si j'ajoute des caractères avant l'endroit ou c'est tronqué le fichier tronqué fait toujours la même taille donc ça ne vient pas d'un caractère dans le fichier.
J'ai essayé de renommer un fichier tronqué en me disant que l'ordre d'appel y était pour quelque chose et il a été lu complètement. Je lui ai remis son nom d'origine et il a été de nouveau tronque.
Ps: je tourne sous windows vista avec eclipse 3.5 et java 6.0
Voici le code de lecture ligne par ligne:
Voici ce que j'ai comme tailles:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 File f = new File(nomFichier) long tailleFichier = f.length(); //lecture normale avec le scanner Scanner scanner = new Scanner(f, "UTF-8"); if (scanner.hasNextLine()) { String contenu = scanner.nextLine(); tailleLue = contenu.length(); System.out.println("lecture du fichier"); while (scanner.hasNextLine()) { contenu = scanner.nextLine(); tailleLue += contenu.length(); } //s'il y a une erreur if (tailleLue < (tailleFichier - 24)) { //on ecrit dans le fichier de log des erreurs erreurs.write(nomFichier + "\n taille lue:" + tailleLue + " Taille reelle " + tailleFichier + "\n"); try { //on essaie de lire plus loin avec un FileReader Writer erreursFichier = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(nomFichier + "ereurLecture.txt", true), "UTF-8")); erreursFichier.write(nomFichier + "\n taille lue:" + tailleLue + " Taille reelle " + tailleFichier + "\n"); erreursFichier.write("Derniere ligne :\n" + contenu + "\n"); try { Reader r = new BufferedReader(new FileReader( nomFichier)); char[] cbuf = new char[200]; int off = (int) tailleLue - 4; int len = 200; StringBuilder s = new StringBuilder(); s.append(contenu); try { while (r.read(cbuf, off, len) == 200) { s.append(cbuf); } } catch (IndexOutOfBoundsException e4) { } finally { s.append(cbuf); } r.close(); erreursFichier.append('\n'); erreursFichier.append(s); } catch (FileNotFoundException e3) { e3.printStackTrace(); } catch (IOException e3) { e3.printStackTrace(); } erreursFichier.close(); } catch (FileNotFoundException e2) { e2.printStackTrace(); } catch (IOException e2) { e2.printStackTrace(); } } scanner.close();
taille lue:35897 Taille reelle 68226
taille lue:68659 Taille reelle 155851
taille lue:68647 Taille reelle 191998
taille lue:35891 Taille reelle 174387
taille lue:68657 Taille reelle 167987
taille lue:19531 Taille reelle 38720
Partager