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
    Points : 3 083
    Points
    3 083
    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)
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  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
    Points : 3 083
    Points
    3 083
    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.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

+ 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