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 :

Buffer d'ecriture fichier problème


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 213
    Par défaut Buffer d'ecriture fichier problème
    Bonjour, j'ai codé une application qui transfert des fichiers du client au servuer en utilisant les socket, cependant j'ai un petit problème, avant toute chose, voici les codes:

    client:
    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
    public void run() {
    		// TODO Auto-generated method stub
    		try {
    			System.out.println("thread client lance");
    		while((instruction = in.readLine()) != null) {
     
    			if(Pattern.matches("^copier>.+$", instruction)) { //si on demande de copier
    				Pattern p = Pattern.compile(">");
    				String[] item = p.split(instruction); //on isole le chemin du fichier
    				File fichier = new File(item[1]);
    				if(fichier.exists()) {
    					long taille = fichier.length(); //on obetient la taille du fhichier
    				reader = new FileInputStream(fichier);
    				int nbreoctet = 0;
    				byte[] tab = new byte[1024]; //preparation des variables pour l'envoie du fichier
    				instruction = (String) instruction+":"+taille;
    				out.write(instruction+"\n"); //on renvoie l'instruction au serveur avec la taille en plus
    				out.flush();
    				Thread.sleep(1000);
    				while((nbreoctet = reader.read(tab)) != -1) {
    					client.getOutputStream().write(tab, 0, nbreoctet);
    					client.getOutputStream().flush();
    				}
    				System.out.println("Transfert terminé");
    				}
    				else
    					System.out.println("le fichier n'existe pas");
     
    			}
    		}
     
    		}catch(Exception e) {e.printStackTrace();}
    	}
    et le serveur:
    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
    public void run() { //tout ce qui est envoyé par le client est receptioné ici
    		// TODO Auto-generated method stub
    		try {
    			while((instruction = in.readLine()) != null) { //attente des instructions clientes
     
    				if(Pattern.matches("^copier>.+$", instruction)) { //si on a demande au client de copier
    					Pattern M = Pattern.compile("\\\\"); //on s'adapte au systeme windows ou linux
    					String[] nom = M.split(instruction); //on isole le nom du fichier seul
    					File fichier = new File(nom[nom.length-1]);
     
    					Pattern P = Pattern.compile(":");
    					String chaine[] = P.split(instruction); //on recupere la taille
    					long taille = Long.valueOf(chaine[chaine.length-1]).longValue(); //on met la taille du fichier dans une variable int
    					long tailletotal = 0; //la totalite des donne transferes
     
    					BufferedOutputStream writerfichier = new BufferedOutputStream(new FileOutputStream(fichier)); //buffer vers le fichier
    					byte[] tab = new byte[1024];
    					int nbreoctet; //on prepare les variables pour le transfert de fichier
     
    					System.out.println("Debut du transfert");
    					System.out.println(taille);
     
    					while(tailletotal < taille) { //on fait la boucle pour enregistrer les donne dans le fichier
    						nbreoctet = client.getInputStream().read(tab);
    						writerfichier.write(tab, 0, nbreoctet);
    						writerfichier.flush();
    						tailletotal = tailletotal + nbreoctet;
    					}
    					writerfichier.flush();
    					writerfichier.close();
    					System.out.println("le transfert du fichier s'est deroule avec succes");
    					System.out.println("fichier recu: "+nom[nom.length-1]+" de l'adresse: "+client.getInetAddress());
    				}//fin de la boucle de copie
     
    				else
    					System.out.println("le client a tente d'envoyer une instruction inconnue");
     
    			}
     
    		}catch(Exception e) {e.printStackTrace(); }
    		}
    Je n'ai mis que les methodes run le reste etant sans importance.

    Maintenant le problème, c'est qu'il m'affiche bien des 2côtés que le transfert et terminé et u'il s'est déroulé avec succès, cependant, le fichier qui a été copier est vide.
    En gros si je copie:
    C:\colorbox.log
    j'aurai un fichier colorbox.log vide dans le dossier de l'appli.

    Quelqu'un sait il d'ou vient le problème?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Est-ce que le code du serveur passe dans la boucle while ? Quelles sont les données lues par le serveur ? Ajoute une trace.
    Dans le client, pourquoi faire une pause d'une seconde ?

    Sinon, le flush ne doit pas se faire dans la boucle while, car tu perds l'utilité du buffer. Le flush doit se faire juste après la dernière instruction d'écriture ou lecture, donc après la boucle.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 213
    Par défaut
    J'ai mis des traces je les ai enlevé.
    Alors, la boucle du client s'effectue, ainsi que celle du serveur
    J'ai affiché la taille total dans chaque boucle côté serveur, et tout était ok.

    Au niveau de la pause, sans, cela ne marchait pas, je crois que la boucle de reçu du serveur n'était pas prête lorsque le client envoyait des donnes, ce qui est bizarre sachant que TCP garantit le reçu des donnees. La boucle cliente me mettait terminée et le thread serveur boclait sur l'instruction du read.
    Pour le flush, je sais tu me l'as déjà dit^^, mais j'ai trop l'habitude de le mettre

    En tout cas merci de ton aide

Discussions similaires

  1. [XL-2003] Lecture/Ecriture fichier txt - Problème caractères spéciaux
    Par Blencastreur dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/06/2012, 18h08
  2. [JDOM] Ecriture fichier xml: Problème de taille
    Par bipbipman2003 dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 22/07/2009, 14h21
  3. [AS2] Lecture Ecriture Fichier Texte
    Par cpr0 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 13/09/2005, 11h22
  4. [LG]Lecture-ecriture fichier
    Par arno15 dans le forum Langage
    Réponses: 19
    Dernier message: 03/02/2005, 22h25
  5. Lecture et ecriture fichier .ini
    Par despe dans le forum C
    Réponses: 6
    Dernier message: 23/07/2003, 20h40

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