Java acces à un fichier depuis différentes classes

Bonjour à tous les geek, je fais encore une fois appel à vos connaissance avancé du java.

 

Bon j’ai un gros code source à comprendre (250 classes et j’ose pas compter les lignes).  Je voudrais pouvoir écrire des variables dans un fichier texte.  Easy à faire quand on a qu’un fichier mais j’aimerais pouvoir ouvrir le flux de sortie au début et puis écrire dans ce flux quand j’en ai envie et à la fin le fermer.

 

Pour faire ceci, je me suis amusé à écrire une petite classe ( Statistical copier en fin de post)

Mais après comme je vais y accéder depuis des classes.  L’ouvrir au début du programme et puis écrire chaque fois que j’ai besoin d’écrire qqch.

Devrais-je tout mettre en static ?

J’avoue que je suis un peu perdu. 

Je pensais pouvoir tout mettre en static et puis pouvoir l’utilisé mais ça marche pas.

Toutes idées constructives est la bien venue.

 

package rspkwm.avalanche.data;

public class Statistical {

	    [b]static[/b] [b]public[/b] PrintWriter ecrivain;

	    [b]public[/b] [b]int[/b] OpenFile (String Filename ){

			  [b]try[/b] {

				    ecrivain =  [b]new[/b] PrintWriter([b]new[/b]BufferedWriter

				       ([b]new[/b] FileWriter(Filename)));

				    [b]return[/b] 1;

			  }	 

			  [b]catch[/b] (Exception e) {   

				    [b]return[/b] 0;

			  }

	    }

	    [b]public[/b] [b]void[/b] WriteInTheFile (String Chaine){

			  ecrivain.print(Chaine); 

				    }

	    [b]public[/b] [b]void[/b] CloseFile(){

	    }

}

Ce message a été édité par klimmrod le 11/03/2004

essaie de l’instancier:

public static void main(String[] args)

{

  String monFichier="";

  Statistical s = new Statistical();

  s.OpenFile(monFichier); 

  s.WriteInTheFile("mon texte");

  s.CloseFile();

}
[/quote]

Tu peux rajouter ca dans ta classe Statistical :

  private static Statical me;

  public static getMe() {

  if (me == null)

	  me = new

Statical();

  return me;

  }

Et après quand tu as besoin d’écrire un truc tu fais Statistical.getMe().WriteInTheFile(“truc”);

[quote]Et après quand tu as besoin d’écrire un truc tu fais Statistical.getMe().WriteInTheFile(“truc”);[/quote]Vi c’est le modele du singleton c’est super classique Si tu veux un objet dont tu as une seule instance unique dans ton programme et que tu utilise comme une sorte de “variable globale” c’est comme ca qu’il faut faire. En revanche… heu… ca s’utilise pas a toutes les sauces, faut que ca soit justifie, pas juste parceque “c’est plus facile d’acceder a mon objet comme ca”.

Je comprends pas pourquoi l’objet me doit être privé.
Si il est juste Static ça suffit pas ?

Non je sais bien mais je cherchais ca pour ne pas devoir ouvrir le fichier à chaque utilisation.  Si il y avait un meilleur moyen je suis complètement ouvert.

Merci pour vos réponses.

Tant que je suis dans les questions, il y a moyen d’écrire à la fin d’un fichier directement pcq pour le moment je le lis je le stock dans un tableau puis je l’ouvre en écriture qui efface tout et remets dedans ce qu’il y avait.  Pas très beau au niveau performance je sais.

Des pistes…

Ce message a été édité par klimmrod le 12/03/2004

Ajoute cette methode à ta classe:

[b] public[/b] [b]static[/b] [b]void[/b] write(String texte, String fichier)

{

Statistical s = new Statistical();

s.OpenFile(fichier);

s.WriteInTheFile(texte);

s.CloseFile();

}
[/quote]ensuite tu as juste a l’appeler de cette facon n’importe ou:
Statistical.write(“mon text”,“c:monFichier.log”);

sinon je peux te proposer une classe de ce style que j’utilise pour générer des logs:

[b] import[/b] java.io.File; [b] import[/b] java.io.FileOutputStream; [b] import[/b] java.io.FileWriter; [b] public[/b] [b]class[/b] LogFileManager

{

 

/**

  • Cette méthode permet de rajouter un message dans un fichier de log.

  • msg : le message à rajouter

  • logFileName : le nom complet du fichier de log

*/

public static synchronized void appendToLog(String msg, String logFileName)

{

try

{

File logFile= new File(logFileName);

// On vérifie si le répertoire ou est le fichier log existe. Si ce n’est pas le cas on le crée.

File logDirectory= new File(logFile.getParent());

if (!logDirectory.exists())

logDirectory.mkdirs();

// On ouvre le fichier de log en ajout

FileOutputStream logStream= new FileOutputStream(logFileName, true);

// On ajoute le message

logStream.write(

("

##################################################################
")

.getBytes());

logStream.write(

(new java.util.Date().toString() + " : ").getBytes());

logStream.write(msg.getBytes());

// On ferme le flux

logStream.close();

} catch (Exception e)

{

e.printStackTrace();

}

}

public static synchronized void writeXport(String msg, String logFileName)

{

try

{

File logFile= new File(logFileName);

// On vérifie si le répertoire ou est le fichier log existe. Si ce n’est pas le cas on le crée.

File logDirectory= new File(logFile.getParent());

if (!logDirectory.exists())

logDirectory.mkdirs();

// On ouvre le fichier de log en ajout

FileWriter f= new FileWriter(logFileName);

f.write(msg);

} catch (Exception e)

{

System.out.println(e);

}

}

public static synchronized void appendToXport(String msg, String logFileName)

{

try

{

File logFile= new File(logFileName);

// On vérifie si le répertoire ou est le fichier log existe. Si ce n’est pas le cas on le crée.

File logDirectory= new File(logFile.getParent());

if (!logDirectory.exists())

logDirectory.mkdirs();

// On ouvre le fichier de log en ajout

FileOutputStream logStream= new FileOutputStream(logFileName, true);

// On ajoute le message

logStream.write(msg.getBytes());

// On ferme le flux

logStream.close();

} catch (Exception e)

{

e.printStackTrace();

}

}

}

ensuite je l'appelle comme ceci:
String msg= "erreur" ; LogFileManager.appendToXportLog(msg,monFichier); [/quote]si tu ne le fais pas déja, je te conseille d'utiliser comme IDE eclipse(gratuit) [url="http://www.eclipse.org"]http://www.eclipse.org[/url], il t'indiquera bien ou sont tes erreurs de propriété (static, synchronized) dans ton code lorsque tu le codera [i]Ce message a été édité par Miqualke le 12/03/2004[/i]

Cela dit, petit detail, mais le .Close() il serait mieux dans un finally pour etre sur que meme en cas de probleme tu referme bien ton stream

Arf, bien vue, exacte!!
Je vais le modifier.
Merci, on va essayer de faire du propre… :P)