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

avec Java Discussion :

Modifier "java.io.BufferedOutputStream" ?


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 36
    Points : 24
    Points
    24
    Par défaut Modifier "java.io.BufferedOutputStream" ?
    Bonjour à tous,

    J'ai codouillé une application qui utilise les threads, mais vu mon niveau...


    En gros, soit je rencontre des problèmes de deadlocks soit je perds l'avantage des threads à moins... qu'il ne soit possible de coder en dur dans "java.io.BufferedOutputStream". Il faudrait modifier son code mais je ne sais pas si c'est possible... ni si ma question est claire... ^^


    merci à vous

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Tu auras plus vite fait d'écrire un autre BufferedOutputStream que d'essayer de modifier son code (ce qui n'est pas impossible puisque ni la classe, ni ses méthodes, ne sont final.)

    Par contre, je ne vois pas le rapport avec les threads.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    Merci d'avoir répondu si vite

    Il faut bosser sur le bytecode si je veux modifier BufferedOutputStream ?


    J'utilise File.renameTo() avec des threads qui accèdent aux mêmes variables et celui-ci est hors de la boucle utilisée par BufferedOutputStream.

    Si nécessaire, je posterai du code...

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    faudrait déjà préciser c'est quoi ton problème. Parce que jusque là tes messages n'ont ni queue ni tête!

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    oui... en effet... désolé...

    J'utilise BufferedOutputStream pour télécharger des fichiers.
    J'ai donc créé une méthode qui utilise deux variables (name / url) avec BufferedOutputStream.

    Lors de téléchargements simultanés, tout fonctionne parfaitement tant que je ne change pas le dossier de destination en cours de route. Les variables "name" et "url" ne sont plus utilisées sur les bons fichiers. J'aimerais donc "forcer" un chemin d'accès directement dans "mon" BufferedOutputStream.

    Je vais suivre le conseil de thelvin...

    J'espère avoir été un peu plus clair.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par ZwQuery Voir le message
    J'espère avoir été un peu plus clair.
    Pas beaucoup. Une fois qu'un BufferedOutputStream a été créé, tu peux modifier toutes les variables que tu veux, en tout cas lui il écrira toujours au même endroit et n'en aura rien à cirer de tes variables.

    De toute façon tu n'as pas dit, concrètement, qu'est-ce qui se passe et pourquoi ce n'est pas bien.

    Citation Envoyé par ZwQuery Voir le message
    Je vais suivre le conseil de thelvin...
    Je vois mal comment.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Points : 2 657
    Points
    2 657
    Par défaut
    Je pense que tu as plus un problème de compréhension de ce que tu veux faire ou du fonctionnement de tout ça qu'autre chose...
    Il vaudrait mieux que tu revienne à la base de ce que tu veux faire et reparte de là.

  8. #8
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    Bonjour à tous,

    Il vaudrait mieux que tu revienne à la base de ce que tu veux faire et reparte de là.
    Oui, de fait...
    Ce sera plus clair avec du code (j'espère :p)


    L'idée du programme est de télécharger simultanément d'autres programmes et de les copier dans un sous-dossier "Outils". Pour ce faire, l'utilisateur clique sur des boutons qui appellent une méthode "download".


    Un thread est créé pour chaque "download". Les variables "name" (nom du fichier à télécharger) et "url" (adresse de l'outil) sont évidemment différentes pour chaque téléchargement.
    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
     
    ...
    protected void download() throws IOException {
     
    ...
     
    java.io.BufferedInputStream in = null;
     
    try {
    in = new java.io.BufferedInputStream(new java.net.URL(url).openStream());
    ...
     
    java.io.BufferedOutputStream bout = new BufferedOutputStream(fos,1024);
    		   				byte[] data = new byte[1024];
    		   				int x=0;
    		   				try {
    								while((x=in.read(data,0,1024))>=0)
    								{
     
     
    								bout.write(data,0,x);
     
    								}
    							} catch (IOException e1) {
    								// TODO Auto-generated catch block
    								isok.setText("Téléchargement de " +name+ " manqué !");
    								e1.printStackTrace();
    							}
    		   				try {
    								bout.close();
    							} catch (IOException e1) {
    								isok.setText("Téléchargement de " +name+ " manqué !");
    								// TODO Auto-generated catch block
    								e1.printStackTrace();
    							}
    		   				try {
    								in.close();
    							} catch (IOException e) {
    								isok.setText("Téléchargement de " +name+ " manqué !");
    								// TODO Auto-generated catch block
    								e.printStackTrace();
     
    							}		
     
     
     
    								final File fichier = new File (name);
    						...
     
    	                          else
    							  {
                                      isok.setText("Téléchargement de " +name+ " terminé !");
    							  }
     
    						     fichier.renameTo(new File("Outils/" +name));
    Tout fonctionne à la perfection (le .JAR est conséquent) sauf que si je télécharge plusieurs fichiers en même temps (plusieurs appels à la méthode "download" avec des variables différentes), le programme ne copie pas les fichiers téléchargés dans le dossier "Outils" (parce que ma variable "name" a changé entretemps).

    Par contre, si je retire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichier.renameTo(new File("Outils/" +name));
    alors tous les outils sont bien téléchargés dans le dossier courant.

    J'aurais donc voulu forcer mon outil à télécharger directement les outils au bon endroit...

    merci

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par ZwQuery Voir le message
    (parce que ma variable "name" a changé entretemps).
    Elle ne devrait pas. Alors plutot que d'essayer de bidouiller pour amener les données directement dans le bon dossier, contente toi de t'assurer que toutes les données qui sont propre à chaque téléchargement sont dans une variable spécifique à ce téléchargement (typiquement ton Thread ou ton Runnable) plutot que d'être générale.

  10. #10
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    Bonsoir et merci à tchize_ d'avoir pris le temps de répondre malgré l'extrême chaos de mes premiers messages.

    Elle ne devrait pas
    Je me doutais qu'il y avait une erreur de conception.


    contente toi de t'assurer que toutes les données qui sont propre à chaque téléchargement sont dans une variable spécifique à ce téléchargement (typiquement ton Thread ou ton Runnable) plutot que d'être générale
    Là, je comprends l'idée mais ne vois pas comment procéder.
    Il me faudrait des noms de variables différents pour chaque téléchargement (name1, url1, name2, url2, ...). Dans ce cas, comment les récupérer pour ne pas devoir écrire 200 fois la méthode "download" ?

    J'avais essayé d'utiliser "Synchronized", mais cela bloque vite le programme si je lance plus de 3 téléchargements simultanément.


    A mon avis, un seul mot clef suffira à orienter mes recherches...
    Est-ce que "wait()" et "notify()" seraient indiqués dans mon cas ?
    isAlive() ne semblait pas renvoyer la bonne valeur.

    Merci de m'indiquer une piste vers la solution qui serait la plus indiquée face à ce souci.

  11. #11
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 980
    Points
    7 980
    Par défaut
    Avant de jouer avec des Thread ou quoi que ce soit de compliqués, réécrit ta fonction pour prendre en paramètre l'url et le name ca ira surement mieux (Je n'ai pas eu l'impression de voir le code qui appele download donc je présume la) comme l'a conseillé Tchize.


    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected void download() throws IOException

    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected void download(URL url, String name) throws IOException
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par ZwQuery Voir le message
    Il me faudrait des noms de variables différents pour chaque téléchargement
    Non, la même variable, mais stockée dans des instance de Thread ou Runnable ou Task ou que sais-je différente:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class MonThread extends Thread {
      private String unTruc;
      public MonThread(String unTruc){this.unTruc=unTruc;}
      public void run(){
     ////
      }
    }
     
    new MonThread("1").start();
    new MonThread("2").start();
    new MonThread("3").start();
    new MonThread("4-0").start();

Discussions similaires

  1. Java requête SQL quote antislash
    Par ritchie23 dans le forum Débuter avec Java
    Réponses: 11
    Dernier message: 01/10/2008, 16h50

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