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 :

java.nio : Channel


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 79
    Points : 42
    Points
    42
    Par défaut java.nio : Channel
    Salut à tous !

    J'ai qq difficultés à faire qq chose d'apparement simple !
    Je cherche à réaliser une méthode qui prend en entrée :
    java.io.Reader reader : le flux contenant ce que je souhaite écrire dans un fichier
    String fileName : le nom du fichier à créer

    Je commence betement comme ça :
    FileChannel destinationStream = new FileOutputStream(fileName).getChannel();

    Mais je ne vois pas comment lui envoyer le flux du Reader tout en essayant de garder les perfs du Channel !!!

    Voila tout,
    merci de votre aide

    Demandez moi des précisions si ce n'est pas assez clair !

  2. #2
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    personne n'a jamais été confronté à ce problème ?

  3. #3
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Il suffit de récupérer les données du reader sous forme de byte (d'ailleur en utilisant Chanel et MappedByteBuffer, ça va augmenter les performances pour les gros fichiers), de mettre ces bytes dans un ByteBuffer et d'envoyer le ByteBuffer dans le channel de sortie.

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    Ok je vais essayer ta solution, en attendant j'ai mis en place ce bout de code :

    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
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.Reader;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
     
    import org.apache.commons.io.IOUtils;
    import org.apache.log4j.Logger;
     
    public class File {
     
    	private static Logger	log	=	Logger.getLogger(File.class.getName());
     
    	public static boolean create(Reader reader,	String	fileName)
    	{
    		boolean 		isOk				=	false;
     
    		FileChannel 	destinationStream	=	null;
     
    		try {			
    			// File creation
    			destinationStream	=	new FileOutputStream(fileName).getChannel();
    			destinationStream.force(true);
     
    			// get byte[] from In Stream
    			byte[]	bytes		=	IOUtils.toByteArray(reader);			
    			ByteBuffer	buffer	=	ByteBuffer.wrap(bytes);
     
    			// Write stream to file
    			destinationStream.write(buffer);
     
    		} catch(FileNotFoundException e) {
    			log.error(e);
            } catch(IOException e) {
    			log.error(e);
    		} catch(Exception e) {
    			log.error(e);
    		} finally {
    			if(destinationStream != null){
    				try{
    					destinationStream.close();
    				} catch (IOException e) {}
    			}
    		}
     
    		return isOk;
    	}
     
    }
    Pour l'instant, ce code ne fonctionne pas à cause de l'erreur suivante :
    java.io.IOException: Attempted read on closed stream.

    Le reader est récuperer de HTTPclient de l'objet GetMethod method

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Reader responseBody = new InputStreamReader(
    		    						method.getResponseBodyAsStream(),
    		    						method.getResponseCharSet());

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    Bon j'avance sur le problème,

    J'ai une classe Client qui me renvoie ce flux Reader dont voici le code
    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
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.Reader;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
     
    import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
    import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.HttpException;
    import org.apache.commons.httpclient.HttpStatus;
    import org.apache.commons.httpclient.cookie.CookiePolicy;
    import org.apache.commons.httpclient.methods.GetMethod;
    import org.apache.commons.httpclient.params.HttpMethodParams;
    import org.apache.commons.io.IOUtils;
    import org.apache.log4j.Logger;
     
     
    public class Client implements IClient {
     
    	private static Logger	log	=	Logger.getLogger(Client.class.getName());
     
     
    	protected static final String	CHARSET	=	"ISO-8859-1";
     
    	private String 	proxy;
    	private String	port;
     
    	protected HttpClient  client;
    	protected GetMethod  method;
     
     
    	public Client(){
    		// Create an instance of HttpClient.
    		client = new HttpClient();
    	}	
     
     
    	public void setProxy(String	proxy, int port)
    	{		
    		// Configure proxy
    		client.getHostConfiguration().setProxy(proxy, port);
    	}
     
    	public Reader get(String url)
    	{	  	
    		Reader responseBody	=	null;
     
    		log.info("connecting to : "+url);
    	    method	=	new GetMethod(url);
    //	    method.getParams().setHttpElementCharset(CHARSET);
    	    method.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
    	    method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
    	    								new DefaultHttpMethodRetryHandler(3, false));
     
    		try {
     
     
    		    // Execute the method.
    		    int statusCode	=	client.executeMethod(method);
     
    		    // Check status
    		    if(statusCode != HttpStatus.SC_OK){
    		    	log.error("Method failed : " + method.getStatusLine());
    		    	return null;
    		    }
    		    // Read the response body.
    		    responseBody	=	new BufferedReader(new InputStreamReader(	method.getResponseBodyAsStream(),
    		    											method.getResponseCharSet()));
     
    		    FileChannel 	destinationStream	=	null;
     
    			try {			
    				// File creation
    				destinationStream	=	new FileOutputStream("toto.xml").getChannel();
    				destinationStream.force(true);
     
    				// get byte[] from In Stream
    				byte[]	bytes		=	IOUtils.toByteArray(responseBody);			
    				ByteBuffer	buffer	=	ByteBuffer.wrap(bytes);
     
    				// Write stream to file
    				destinationStream.write(buffer);
    				log.debug("yoooooooooo");
     
    			} catch(FileNotFoundException e) {
    				log.error(e);
    	        } catch(IOException e) {
    				log.error(e);
    			} catch(Exception e) {
    				log.error(e);
    			} finally {
    				if(destinationStream != null){
    					try{
    						destinationStream.close();
    					} catch (IOException e) {}
    				}
    			}
     
            } catch (HttpException e) {
            	log.error("Fatal protocol violation: ", e);
            } catch (IOException e) {
            	log.error("Fatal transport error: ", e);
            } catch (Exception e) {
            	log.error("Exception : ", e);
            } finally {
            	// Release the connection.
            	if(method!=null){
            		method.releaseConnection();        	
            		log.info("connection released");
            	}
            }
     
            return responseBody;
    	}
    Je remarque qu'une fois sortie du bloc d'exception englobant le tout.
    Je ne peux plus manipuler le reader et je catch l'exception cité dans le post précédent.

    Sinon, dans le bloc en question j'arrive à créer le fichier !!!


    Je ne comprends pas le fonctionnement !

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    Suite des tests, je ne sais pas si je captive grand monde mais je suis vraiment tres embarassé avec ces histoires !!!

    Je me suis demandé si le Buffer mettait du temps à se remplir et donc de patienter avant de le manipuler !

    Donc j'essaie de jouer avec la méthode suivante : Reader.ready().
    Cette méthode m'indique si le Stream est pret pour etre lu ou non !
    je tente donc en vain l'ajout de ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    				while(!responseBody.ready()){
    					Thread.sleep(10);
    				}
    La boucle ne s'arrete jamais !!! Alors que sans ce test, l'écriture s'effectue convenablement !

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    ce probleme n'interesse personne ???

Discussions similaires

  1. java.nio : utilisation des Channel
    Par jan0 dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 23/05/2016, 14h45
  2. PB socket java.nio.channels.Selector
    Par bobolebrikiller dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 18/05/2010, 08h47
  3. Réponses: 3
    Dernier message: 20/10/2006, 20h50
  4. [reseau ] java.nio.channels
    Par AMARI_SALIM dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 10/04/2006, 23h43
  5. Réponses: 3
    Dernier message: 22/11/2005, 20h23

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