2009-02-21 5 views
2
public void exportUrlsToFile(String file, String urls) throws IOException { 
    String[] urlsArray = urls.split("\\s+");// split on one or more white space characters. 

    // create a fresh file 
    RandomAccessFile raf = new RandomAccessFile(file, "rw"); 

    for (String line : urlsArray) { 
     line = line.trim(); 
     if (line.isEmpty()) {// this won't happen! 
      continue; 
     } 
     raf.writeBytes(line); 
     raf.writeBytes(newline); 
    } 
    // close the file handler 
    raf.close(); 
} 

Fondamentalement, j'utilise cette classe pour faire quelque chose. Cela fait partie de l'application qui s'exécute dans Tomcat JVM. J'ai remarqué que chaque fois que cette méthode est appelée, elle crée un fichier avec le même nom que l'argument et après raf.close(), il est toujours là. Comment puis-je m'assurer que le fichier temporaire est supprimé.Java RandomAccessFile

Merci d'avance.

+0

Etrange ... à quoi voulez-vous le fichier? – OscarRyz

Répondre

1

Utilisez plutôt File.createTempFile()?

Je me rends compte que cela ne vous donnera pas les mêmes caractéristiques que RandomAccessFile mais vous pourriez construire ce dont vous avez besoin en plus de cela.

En fait, je ne sais même pas pourquoi vous écrivez ces choses dans un fichier. Est-ce une sorte de suivi de l'utilisation? Pourquoi ne pas simplement le stocker en mémoire?

+0

Il s'agit d'une application Web struts, afin que les struts puissent télécharger un fichier, vous avez besoin que vous diffusiez à partir d'un fichier. J'ai toujours pensé que le fichier d'accès aléatoire est pour la création en mémoire d'un fichier sans en créer un physique. – samsina

2

Je vais supposer que vous montrez seulement une petite partie du code et qu'il y a une bonne raison pour laquelle vous utilisez RandomAccessFile quand il ne semble pas qu'un accès aléatoire est fait.

je ferais quelque chose comme ceci:

public void exportUrlsToFile(String file, String urls) throws IOException { 
    String[] urlsArray = urls.split("\\s+"); 

    // create a fresh file 
    RandomAccessFile raf = new RandomAccessFile(file, "rw"); 

    try { 
    for (String line : urlsArray) { 
     line = line.trim(); 
     if (line.isEmpty()) { // this won't happen! 
     continue; 
     } 
     raf.writeBytes(line); 
     raf.writeBytes(newline); 
    } 
    } finally { 
    // don't leak file handles on Exception -- put close in "try/finally" 
    try { raf.close(); } catch (IOException e) { /* ignore */ } 
    File todelete = new File(file); 
    if (!todelete.delete()) { 
     // Log a complaint that we couldn't delete the temp file 
    } 
    } 
} 

EDIT: Je suis d'accord, nous ne voulons pas que le IOException théorique close() pour causer des problèmes. Mieux que d'ignorer ce serait de se connecter un "Nous ne nous attendions jamais à voir cela ...." à l'exception. Je crée souvent une méthode closeWithoutException() juste pour envelopper ceci. Fermer théoriquement IOException semble abuser des exceptions vérifiées car il n'y a rien que l'on puisse attendre de l'appelant en réponse.

5

Une meilleure question serait pourquoi vous voudriez passer par tous les problèmes de faire le dossier, écrire des choses dans le dossier, et alors juste effacez le dossier? Peu importe, vous n'avez pas besoin d'un fichier d'accès aléatoire - un FileWriter serait mieux.

Pour vous assurer que le fichier est supprimé faire comme Eddie suggère et mettre le supprimer dans un bloc finnaly - mais vous devrez également veiller à ce que le raf.close() IOException est géré ... quelque chose comme:

 
} finally { 
    try 
    { 
     raf.close(); 
    } 
    catch(final IOException ex) 
    { 
     // in 14 years of Java programming I still don't know what to do here! ;-) 
    } 
    finally 
    { 
     File todelete = new File(file); 
     if (!todelete.delete()) { 
      // Log a complaint that we couldn't delete the temp file 
     } 
    } 
} 

Edit:

vous pourriez aussi dire que, après le processus Tomcat terminé le fichier est toujours là et que vous voulez parti. Si c'est le cas, regardez java.io.File.deleteOnExit(). Cela devrait supprimer les fichiers lorsque la JVM Tomcat existe.

+0

he he hehe ... la plupart du temps, vous n'y faites rien. ... – OscarRyz

+0

en 14 ans c'est tout ce que j'ai jamais fait :-) (bien l'enregistrer ... mais ça ne sert à rien étant donné que ça n'arrive jamais!) – TofuBeer

+0

Je ne fais que connecter le système, en principe; Je n'ai jamais eu de close throw une IOException non plus. C'est l'une des preuves contre les exceptions vérifiées, des méthodes qui en "lancent" une parce que l'interface le déclare ainsi, mais ce n'est pas le cas. –

0

Avez-vous essayé?

File temp = File.createTempFile("file", ".tmp"); 
temp.deleteOnExit();