2017-06-20 4 views
-1

Je dois déplacer un grand nombre de fichiers (presque 60 Mo chacun) du dossier A vers le dossier B. Dossier B est un dossier ai/p pour une tâche programmée Spring . il choisit ces fichiers et commence le traitement en parallèle. J'utilise les méthodes utilitaires de fichiers de Guava pour déplacer les fichiers.Files.move() de Guava déplace-t-il les fichiers ou les copie-t-il?

Files.move(sourceFile,targetFile,Charsets.UTF_8); 

Je ne vois erreur dans ma classe TaskScheduler que le fichier est pas là pour lire

à org.apache.commons.io.FileUtils.openInputStream (FileUtils.java:299) ~ [ commons-io-2.4.jar: 2.4] à org.apache.commons.io.FileUtils.lineIterator (FileUtils.java:1856) ~ [commons-io-2.4.jar: 2.4] à com.varun.processor. readFile (Processor.java:342) ~ [classes /:?]

Mon intuition est que le fichier est dans la copie et donc le thread programmé de Spring n'a pas pu acquérir le verrou pour le lire. Selon le document de Guava, sa méthode de déplacement se comporte comme la commande mv sous unix mais je vois le code comme copie dans le goyavier.

enter image description here

Quelqu'un peut-il suggérer une meilleure façon de déplacer des fichiers sur le système unix à partir de l'application de printemps Où o répertoire/p est i/p pour un autre processus en aval.

+8

copie seulement si la 'RenameTo' échoue. –

+3

Voici comment 'mv' fonctionne. S'il ne peut pas déplacer le fichier sur place, il crée une copie, puis supprime l'original. –

Répondre

0

Le déplacement de fichiers avec Goyava fonctionne correctement. vous devez juste continuer à essayer de lire le fichier jusqu'à ce qu'il réussisse.

J'ai testé le déplacement d'un fichier de 525 Mo et Guava l'a déplacé en moins d'une seconde.

voir exemple ci-dessous (j'ai ajouté intentionnellement un retard avant de déplacer le fichier, de sorte que le processeur de fichiers va essayer d'ouvrir le fichier avant et pendant qu'il était déplacé):

import com.google.common.io.ByteSource; 
import com.google.common.io.Files; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.util.concurrent.Callable; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.TimeUnit; 
import java.util.logging.Level; 
import java.util.logging.Logger; 


/** 
* <dependency> 
* <groupId>com.google.guava</groupId> 
* <artifactId>guava</artifactId> 
* <version>22.0</version> 
* </dependency> 
*/ 
public class GuavaFileMoveExample { 

    private static final Logger LOGGER = Logger.getLogger("GuavaFileMoveExample"); 

    public static void main(String[] args) throws IOException, InterruptedException { 
     GuavaFileMoveExample a = new GuavaFileMoveExample(); 
     a.doTheWork(); 
    } 

    private void doTheWork() throws InterruptedException { 

     ExecutorService executorService = Executors.newFixedThreadPool(2); 
     executorService.submit(new FileMover()); 
     executorService.submit(new FileProcessor()); 
     executorService.shutdown(); 
     executorService.awaitTermination(10, TimeUnit.SECONDS); 


    } 
} 

class FileMover implements Callable<Void> { 

    private static final Logger LOGGER = Logger.getLogger("FileMover"); 

    @Override 
    public Void call() throws Exception { 
     Thread.sleep(1000); 
     moveFile(); 
     return null; 
    } 

    private void moveFile() { 
     final File sourceFile = new File("/tmp/origin/ideaIU-2016.3-no-jdk.tar.gz"); 
     final File targetFile = new File("/tmp/destination/ideaIU-2016.3-no-jdk.tar.gz"); 

     try { 
      LOGGER.log(Level.INFO, "started moving file"); 
      Files.move(sourceFile, targetFile); 
      LOGGER.log(Level.INFO, "finished moving file"); 
     } catch (IOException e) { 
      LOGGER.log(Level.WARNING, "ioexception while moving file ", e); 
     } 

    } 
} 

class FileProcessor implements Callable<Void> { 

    private static final Logger LOGGER = Logger.getLogger("FileProcessor"); 

    @Override 
    public Void call() throws Exception { 
     readBinaryFile("/tmp/destination/ideaIU-2016.3-no-jdk.tar.gz"); 

     return null; 
    } 

    private byte[] readBinaryFile(String aFileName) { 
     File file = new File(aFileName); 
     ByteSource source = Files.asByteSource(file); 


     byte[] result = null; 
     while (result == null) { 
      try { 
       LOGGER.log(Level.INFO, "started reading file"); 
       result = source.read(); 
       LOGGER.log(Level.INFO, "finished reading file. size: " + result.length); 
      } catch (FileNotFoundException e) { 
       // expected if file is not yet at destination 
      } catch (IOException e) { 
       LOGGER.log(Level.SEVERE, "error reading file", e); 
       break; 
      } 
     } 

     return result; 
    } 
}