2011-12-13 3 views
0

L'application Java que je gère enregistre certains détails dans un fichier plat. Le problème auquel je suis confronté est que l'entrée est très faible par rapport à la veille. Cette entrée est essentielle car nos rapports sont générés en fonction du fichier. Je suis allé thro code pour l'écriture, je ne pouvais pas comprendre les problèmes. la méthode qui écrit est la méthode de synchronisation.L'écriture Java dans un fichier texte ne fonctionne pas correctement

Des suggestions? Je peux également fournir le code pour vous dont vous pourriez avoir besoin?

public synchronized void log (String connID, String hotline, String callerType, 
     String cli, String lastMenu, String lastInput, 
     String status, String reason) 
    { 
    //String absoluteFP = LOG_LOC + ls + this.getFilename(); 

    //PrintWriter pw = this.getPrintWriter(absoluteFP, true, true); 

    try 
    { 
     pw.print (this.getDateTime()+ ","+connID +","+hotline+","+callerType+","+ cli+"," + lastMenu + "," + lastInput + "," + status + "," + reason);    


     //end 1006 
     pw.print (ls); 
     pw.flush(); 
     //pw.close(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     return; 
    } 
} 

private synchronized PrintWriter getPrintWriter (String absoluteFileName, 
     boolean append, boolean autoFlush) 
{ 
    try 
    { 
     //set absolute filepath 
     File folder = new File (absoluteFileName).getParentFile();//2009-01-23 

     File f = new File (absoluteFileName); 

     if (!folder.exists())//2009-01-23 
     { 
      //System.out.println ("Call Detailed Record folder NOT FOUND! Creating a new);  
      folder.mkdirs(); 

      //System.out.println ("Configure log folder"); 
      this.setHiddenFile (LOG_LOC);//set tmp directory to hidden folder 

      if (!f.exists()) 
      { 
       //System.out.println ("Creating a new Call Detailed Record...");//2009-01-23 

       f.createNewFile();//2009-01-23 

           } 
     } 
     else 
     { 
      if (!f.exists()) 
      { 
       //System.out.println ("Creating a new Call Detailed Record...");//2009-01-23 

       f.createNewFile();//2009-01-23 


      } 
     } 

     FileOutputStream tempFOS = new FileOutputStream (absoluteFileName, append); 
     if (tempFOS != null) 
     { 
      return new PrintWriter (tempFOS, autoFlush); 
     } 
     else 
     { 
      return null; 
     } 
    } 
    catch (Exception ex) 
    { 
     ex.printStackTrace(); 
     return null; 
    } 
} 

      /** 
      * Set the given absolute file path as a hidden file. 
     * @param absoluteFile String 
     */ 
    private void setHiddenFile (String absoluteFile) 
     { 
    //set hidden file 
    //2009-01-22, KC 
    Runtime rt = Runtime.getRuntime(); 
    absoluteFile = absoluteFile.substring (0, absoluteFile.length() - 1);//2009-01-23 
    try 
    { 
     System.out.println (rt.exec ("attrib +H " + "\"" + absoluteFile +  "\"").getInputStream().toString()); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 

private String getDateTime() 
{ 
    //2011-076-09, KC-format up to milliseconds to prevent duplicate PK in CDR table. 
    //return DateUtils.now ("yyyy/MM/dd HH:mm:ss"); 
    return DateUtils.now ("yyyy/MM/dd HH:mm:ss:SSS"); 
    //end 0609 
} 

private String getFilename() 
{ 
    ///return "CDR_" + port + ".dat";//2010-10-01 
    return port + ".dat";//2010-10-01 
} 

public void closePW() 
{ 
    if (pw != null) 
    { 
     pw.close(); 
    } 
} 
+0

Êtes-vous sûr que les entrées de journal sont vraiment manquantes (peut-être qu'il n'y avait pas beaucoup d'activité pour ce jour-là)? Si vous utilisez une bibliothèque de journalisation établie (et vous devriez probablement le faire), il est très improbable qu'ils aient cette fonctionnalité de base erronée. – Thilo

+2

pouvez-vous poster du code? –

+1

Je n'ai aucune idée de ce que vous voulez arriver. S'il vous plaît poster un code pertinent afin que nous ayons un endroit pour commencer à ce sujet. – Jon

Répondre

1

Vous avez créé un FileOutputStream, mais ne fermons pas ce flux. Fermez ce flux et réessayez. Cela pourrait causer le problème.

Les messages sont parfois consignés parce que le garbage collector entre en action à certains intervalles et ferme le FileOutStream. Cela permet ensuite de consigner les messages à nouveau. Vous obtenez l'erreur inaccessible puisque vous avez une instruction return dans les blocs if & else. Vous devrez prendre le PrintWriter et FileOutStreamWriter sur le getPrintWriter mettez-le où vous appelez habituellement le getPrintWriter(). Ensuite, vous serez en mesure de fermer les flux correctement. getPrintWriter ne devrait assurer le fichier existe, donc le renommer à ensureFileExistance

+0

Juste une dernière précision, supposons que je sépare ces deux méthodes à deux méthodes différentes, dois-je faire en sorte que mon dossier existe également pour être une méthode de synchronisation? – AKV

+0

non requis. 'file.mkDirs()' échouera, mais ne donnera pas d'exception. Ce sera en sécurité. –

+0

merci .. Je vais faire les changements en conséquence. – AKV

1

Si vous pouvez utiliser Apache Common IO, essayez ceci:

public synchronized void log(String connID, String hotline, String callerType, 
     String cli, String lastMenu, String lastInput, 
     String status, String reason) { 
    String absoluteFP = LOG_LOC + ls + this.getFilename(); 
    File file = new File(absoluteFP); 
    String message = this.getDateTime() + "," + connID + "," + hotline + "," + callerType + "," + cli + "," + lastMenu + "," + lastInput + "," + status + "," + reason; 
    try { 
     // note that you must explicitly add new line character if you want the line to end with newline 
     FileUtils.write(file, message + "\n", "UTF-8", true); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

En commun IO 2.1, vous pouvez ajouter un fichier que vous ÉCRITURE à. Vous pouvez maintenant vous débarrasser de closePW et getPrintwriter et puisque la méthode du journal est synchronized, le fichier peut être écrit un à la fois à partir du même objet. Cependant, si vous essayez d'écrire le même fichier à partir d'un objet différent en même temps, vous finirez par avoir un problème d'écrasement.

De même, Common IO crée automatiquement le dossier parent manquant pour vous. Il n'est pas nécessaire de vérifier et de créer explicitement le dossier.

Questions connexes