2017-07-30 4 views
3

J'ai un fichier avec 120 lignes et je veux les déplacer les unes après les autres dans un autre fichier avec un intervalle par exemple de 1 secondes et pouvoir trouve après 10 secondes 10 lignes dans le nouveau fichier.Java, copier d'un fichier à un autre, ligne par ligne avec un intervalle

Mais pour mon cas, j'exécute le programme avec 0 lignes dans les nouveaux fichiers jusqu'à la fin, puis je trouve les données. Deuxièmement, pour que 4 fichiers traitent au même moment avec des intervalles différents, j'ai besoin d'utiliser Threads? Merci pour votre aide.

+0

Je n'ai pas la deuxième partie de votre question * Mais pour mon cas, je traiter pour 120 lignes avec 0 lignes dans les nouveaux fichiers jusqu'à la fin et puis je trouve les données ce que je ne cherche pas. * – Ravi

+0

Désolé, je n'ai pas exprimé correctement ce que je veux. Avec ce code, je dois attendre 120 secondes pour voir une donnée dans le fichier, et ce que je veux, c'est trouver après 40 secondes, 40 lignes dans le nouveau fichier. –

+0

Pour la deuxième partie, vous pouvez aussi le faire dans un fil, mais ce sera compliqué. Pour une solution propre, vous devez utiliser un thread pour traiter un fichier. –

Répondre

1

Lorsque vous écrivez dans un fichier texte, PrintWriter ne l'écrit pas immédiatement sur le disque. Au lieu de cela, il conserve les données dans un tampon en mémoire.

Vous pouvez vider manuellement le tampon lorsque vous avez besoin de données sur le disque. Juste après println() appelez flush() comme ci-dessous.

 while ((line = br.readLine()) != null) { 
      pw.println(line); 
      pw.flush(); 
      Thread.sleep(1000); 
    } 
+0

Je viens d'essayer, ça marche. Merci! Si je veux traiter 4 fichiers en même temps, j'ai besoin d'utiliser Threads? droite ? –

+0

@RahXenLegacy. "Thread" a du sens quand vous voulez traiter plusieurs choses en parallèle. – Ravi

0

Vous pouvez appeler un

pw.flush(); 

directement après

pw.println(line); 

Cela devrait faire l'affaire.

+0

Merci pour votre aide! –

+0

@RahXenLegacy vous savez que vous pouvez encore upvote (pas accepter) plus d'une réponse <;-) –

+0

Ouais je l'ai fait et j'ai un pop-up d'avoir moins de 15 pts de réputation. –

0

Quant à votre deuxième partie, vous pourriez faire quelque chose comme ça, si vous ne voulez pas utiliser les threads:

public static void main(final String[] args) { 
    FileCopyDto[] files = new FileCopyDto[] { 
      new FileCopyDto("D:\\oldfile.txt", "D:\\newfile.txt", 5), 
      new FileCopyDto("D:\\oldfile2.txt", "D:\\newfile2.txt", 1) 
    }; 

    try { 
     boolean dataAvailable = true; 
     int secondCount = 0; 
     while (dataAvailable) { 
      dataAvailable = false; 
      for (FileCopyDto d : files) { 
       d.write(secondCount); 
       dataAvailable = dataAvailable || d.isDataAvailable(); 
      } 
      secondCount++; 
      Thread.sleep(1000); 
     } 
     for (FileCopyDto d : files) { 
      d.close(); 
     } 

    }catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

static class FileCopyDto { 
    String sourceFileName; 
    String destinationFileName; 
    int timeInSeconds; 
    BufferedReader br = null; 
    PrintWriter pw = null; 
    String nextLine; 

    public FileCopyDto(final String sourceFileName, 
      final String destinationFileName, 
      final int timeInSeconds) { 
     this.sourceFileName = sourceFileName; 
     this.destinationFileName = destinationFileName; 
     this.timeInSeconds = timeInSeconds; 
    } 

    public void open() throws IOException { 
     br = new BufferedReader(new FileReader(sourceFileName)); 
     pw = new PrintWriter(new FileWriter(destinationFileName)); 
    } 

    public boolean isDataAvailable() throws IOException { 
     if (br == null) { 
      open(); 
     } 
     return (nextLine == null) || ((nextLine = br.readLine()) != null); 
    } 

    public void write(final int secondCount) { 
     if (nextLine != null && secondCount % timeInSeconds == 0) { 
      pw.println(nextLine); 
      pw.flush(); 
      nextLine = null; 
     } 
    } 

    public void close() throws IOException { 
     br.close(); 
     pw.close(); 
     br = null; 
    } 
} 
+0

J'ai essayé le code avec sortie à la console pour suivre le processus mais il semble qu'il n'y ait pas d'accès à la méthode d'écriture –