IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

[NIO] ClosedByInterruptException soudain et aléatoire


Sujet :

Entrée/Sortie Java

  1. #1
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut [NIO] ClosedByInterruptException soudain et aléatoire
    Salut,

    Je me retrouve face à un problème qui me laisse perplexe.
    J'ai un service Windows en java qui traite des fichiers, j'écoute un répertoire et quand un fichier y est créé, je teste son accessibilité puis je le traite s'il l'est.
    Hors, depuis la mise à jour en SP2 de nos serveurs Windows Server 2003, j'ai une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    java.nio.channels.ClosedByInterruptException
    	at java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:184)
    	at sun.nio.ch.FileChannelImpl.size(FileChannelImpl.java:317)
    	at ch.idinfo.basis.common.util.FileUtils.copyFile(FileUtils.java:324)
    Voici mon code de test d'accessibilité du fichier (un peu maniclette mais j'ai rien trouvé de mieux) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    	/**
             * Check the accessibility of the given file by trying to create a copy of it.
             *
             * @param file The file to be checked.
             * @return true if the file is accessible, false if not
             */
    	public static boolean isFileAccessible(File file) {
    		if (!file.canWrite()) {
    			return false;
    		}
    		File newFile = null;
    		int cpy = 1;
    		try {
    			newFile = new File(System.getProperty("java.io.tmpdir"), file.getName() + ".cpy");
    			while (newFile.exists()) {
    				newFile = new File(System.getProperty("java.io.tmpdir"), file.getName() + ".cpy." + cpy++);
    			}
    			newFile.deleteOnExit();
    			copy(file, newFile);
    			Thread.sleep(1000);
    			byte[] b1 = loadFileToBytes(file);
    			byte[] b2 = loadFileToBytes(newFile);
    			delete(newFile);
    			if (b1.length != b2.length) {
    				return false;
    			}
    			if (!md5sum(b1).equals(md5sum(b2))) {
    				return false;
    			}
    		} catch (IOException e) {
    			return false;
    		} catch (OverlappingFileLockException e) {
    			s_logger.warn(e.getMessage() + ": " + file + " => " + newFile);
    		} catch (InterruptedException e) {
    			s_logger.warn(e.getMessage(), e);
    		} catch (NoSuchAlgorithmException e) {
    			s_logger.error(e.getMessage(), e);
    		} catch (Throwable t) {
    			s_logger.fatal(t.getMessage(), t);
    		}
    		return true;
    	}
     
    	/**
             * Copy the file or directory <code>input</code> to the file or directory <code>output</code>.
             *
             * @param input File or Directory to be copied
             * @param output Copy
             * @throws IOException
             */
    	public static void copy(File input, File output) throws IOException {
    		copy(input, output, false);
    	}
     
    	/**
             * Copy the file or directory <code>input</code> to the file or directory <code>output</code>.
             *
             * @param input File or Directory to be copied
             * @param output Copy
             * @param force Force the writting if outputFile already exists
             * @throws IOException
             */
    	public static void copy(File input, File output, boolean force) throws IOException {
    		if (input.isDirectory() && output.isDirectory()) {
    			copyDir(input, output, force);
    		} else {
    			copyFile(input, output, force);
    		}
    	}
     
    	/**
             * Copy the file <code>inputFile</code> to the file <code>outputFile</code>.
             *
             * @param inputFile File to be copied
             * @param outputFile Copy
             * @param force Force the writting if outputFile already exists
             * @throws IOException
             */
    	public static void copyFile(File inputFile, File outputFile, boolean force) throws IOException {
    		if (!force && outputFile.exists()) {
    			throw new IOException("File " + outputFile + " already exists.");
    		} else if (outputFile.exists()) {
    			outputFile.delete();
    		}
    		FileChannel in = null;
    		FileChannel out = null;
    		try {
    			in = new FileInputStream(inputFile).getChannel();
    			out = new FileOutputStream(outputFile).getChannel();
    			in.transferTo(0, in.size(), out);
    		} finally {
    			if (in != null) {
    				try {
    					in.close();
    				} catch (IOException e) { }
    			}
    			if (out != null) {
    				try {
    					out.close();
    				} catch (IOException e) { }
    			}
    		}
    	}
    Ca plante sur le in.size() de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    in.transferTo(0, in.size(), out);
    de la méthode #copyFile(File, File, boolean).

    Ce code de copie de fichier est celui de la FAQ. J'en avais un autre avant mais il plantait encore pire.

    Si vous avez des idées, je suis preneur !
    (s'il y a plus simple pour vérifier qu'un fichier est accessible, c'est-à-dire qu'il n'y a aucun programme qui n'y accède, je suis à fond preneur également).

    Merci

    PS: Je suis en Java 6 (b01)

  2. #2
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    J'ai résolu le problème en tentant une copie sans utiliser NIO si celle-ci a planté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    	/**
             * Copy the file <code>inputFile</code> to the file <code>outputFile</code>.
             *
             * @param inputFile File to be copied
             * @param outputFile Copy
             * @param force Force the writting if outputFile already exists
             * @throws IOException
             */
    	public static void copyFile(File inputFile, File outputFile, boolean force) throws IOException {
    		if (!force && outputFile.exists()) {
    			throw new IOException("File " + outputFile + " already exists.");
    		} else if (outputFile.exists()) {
    			outputFile.delete();
    		}
    		FileChannel in = null;
    		FileChannel out = null;
    		try {
    			in = new FileInputStream(inputFile).getChannel();
    			out = new FileOutputStream(outputFile).getChannel();
    			in.transferTo(0, in.size(), out);
    		} catch (IOException e) {
    			s_logger.warn("IOException, will use non-nio method", e);
    			// The outputFile may have been created by upper code so we must force
    			copyFileIO(inputFile, outputFile, true);
    		} finally {
    			if (in != null) {
    				try {
    					in.close();
    				} catch (IOException e) { }
    			}
    			if (out != null) {
    				try {
    					out.close();
    				} catch (IOException e) { }
    			}
    		}
    	}
     
    	/**
             * Copy the file <code>inputFile</code> to the file <code>outputFile</code>.
             * <p>This is the non-nio method.</p>
             *
             * @param inputFile File to be copied
             * @param outputFile Copy
             * @param force Force the writting if outputFile already exists
             * @throws IOException
             */
    	private static void copyFileIO(File inputFile, File outputFile, boolean force) throws IOException {
    		if (!force && outputFile.exists()) {
    			throw new IOException("File " + outputFile + " already exists.");
    		} else if (outputFile.exists()) {
    			outputFile.delete();
    		}
    		FileInputStream sourceFile = null;
    		FileOutputStream destinationFile = null;
    		try {
    			outputFile.createNewFile();
    			sourceFile = new FileInputStream(inputFile);
    			destinationFile = new FileOutputStream(outputFile);
    			// Read by 0.5Mo parts
    			byte[] buffer = new byte[512 * 1024];
    			int nbLecture;
    			while ((nbLecture = sourceFile.read(buffer)) != -1) {
    				destinationFile.write(buffer, 0, nbLecture);
    			}
    		} finally {
    			if (sourceFile != null) {
    				try {
    					sourceFile.close();
    				} catch (Exception e) { }
    			}
    			if (destinationFile != null) {
    				try {
    					destinationFile.close();
    				} catch (Exception e) { }
    			}
    		}
    	}
    Frustrant mais ça marche.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Nombre aléatoire en SQL
    Par sqlnet dans le forum Langage SQL
    Réponses: 8
    Dernier message: 19/08/2003, 12h38
  2. clé primaire aléatoire
    Par peuh dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 23/06/2003, 20h51
  3. Eviter deux nombres identiques dans un tirage aléatoire
    Par moon tiger dans le forum Pascal
    Réponses: 5
    Dernier message: 25/11/2002, 09h57
  4. Générer un nombre aléatoire entre 0 et 1 (INCLUS !!!)
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 22/08/2002, 16h30
  5. Récupérer 10 nb différents avec un calcul aléatoire
    Par BXDSPORT dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2002, 02h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo