Bonjour,
j'ai une application répartie basée sur le systeme de fichier de linux.
J'ai un Thread qui ecrit un fichier et un autre qui attend que le fichier existe et que sa taille soit differente de zero avant de le lire.
Le probleme est qu'il arrive (c'est aléatoire meme si c'est relativement rare) sur des gros fichiers (plus de 8ko) que le fichier ecrit ne s'ecrive pas completement ! (il fait pile 8192 octets au lieu de 9976) Du coup, la lecture est partielle, et mon application tombe (je lis un flux xml)
Comment est-ce possible ? y a t'il des précautions particulieres a prendre ?
Je vous donne le code des deux fonctions appelés par les thread :
Merci ;o)
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89 /** * Ecrit une chaine dans un fichier * @param filename Le nom du fichier a ecrire * @param content La chaine a ecrire dans le fichier */ public static void put(String filename, String content) { System.out.println("Put "+filename+"..."); File f=new File(filename); try { FileOutputStream fos=new FileOutputStream(f); fos.write(getEncodingBytes(content)); // ecriture... fos.flush(); fos.close(); fos=null; } catch (Exception ex) { error("Erreur d'E/S flux sortant pour ecriture de "+content.length()+" octets dans "+filename); ex.printStackTrace(); } f=null; System.out.println("Put "+filename+" OK"); } /** * Lit le fichier et renvoi une chaine de caractere * @param filename Le nom du fichier a lire * @return Le contenu du fichier */ public static String read(String filename) { String content=""; int bufferSize=1024; byte[] buffer=new byte[bufferSize]; int lus=0; FileInputStream fis=null; File f; System.out.println("Try to read "+filename+"..."); waitUntilExist(filename); // attente jusqu'a ce que le fichier existe et que la taille soit differente de 0 f=new File(filename); content=""; try { fis=new FileInputStream(f); // creation du flux while ((lus=fis.read(buffer))!=-1) { content+=getEncodingString(buffer, 0, lus); // concatenation du contenu } fis.close(); fis=null; } catch (Exception ex3) { error("Erreur d'E/S flux entrant sur "+filename); ex3.printStackTrace(); } buffer=null; f=null; System.out.println("Read "+filename+" OK"); return content; } /** * Attend que le fichier passé en parametre existe en faisant un sleep sur le thread courant * @param filename Le nom du fichier a attendre */ public static void waitUntilExist(String filename) { File f=new File(filename); System.out.println("Waiting "+filename+" exist..."); // attente jusqu'a ce que le fichier existe int i=0; while (!f.exists() || (f.length()==0)) { i++; System.out.print("w"); try { Thread.sleep(300); // attente 300ms i++; } catch (Exception ex) {} } f=null; System.out.println("Sleeping "+300*i+" ms"); }
Fladnag
PS : les instructions qui ne sont pas indentées sont des instructions de debuggage, elles n'ont pas d'influence sur le reste du code...
Partager