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 :

Question sur la classe InputStream


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Points : 26
    Points
    26
    Par défaut Question sur la classe InputStream
    Salut,

    Bon, je vais essayer d'être le plus clair possible...

    J'ai un InputStream, je lis admettons 512 octets dessus.
    Si je reprends cet InputStream dans une méthode, le flux aura 512 octets en moins ?

    Exemple:
    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
    		byte[] buffer = new byte[512];
     
    		int bytesRead = 0;
     
    		while(bytesRead < 512) 
    		{
    			int bytes = is.read(buffer, bytesRead, 512 - bytesRead);
     
    			if(bytes == -1)
    			{
    				break;
    			}
     
    			bytesRead+= bytes;
    		}
    Ensuite:
    Donc là je récupère alors le InputStream - 512 octets du début, c'est ça ?

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    Si tu connaît à l'avance le nombre d'octets que tu doit lire, il n'y a aucune raison que tu face une boucle pour récupérer ton flux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    byte[] data = new byte[512];
    is.read(data);
    suffit.

    Attention quand même, si le nombre d'octets à lire est très grand il vaut mieux récupérer le flux en plusieurs fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int sizeMax = 2048;
    byte[] data = new byte[sizeMax];
    int nbData;
    while((nbData = is.available()) > 0)
    {
         is.read(data, 0, ((nbData > sizeMax) ? sizeMax : nbData));
     
         //  traitement des octets reçus
    }

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Points : 26
    Points
    26
    Par défaut
    Ouais, mais ça réponds pas à ma question, ou alors j'ai rien compris...

    Je vais expliquer l'utilisation de mon programme:

    je reçois un InputStream représentant un flux RSS, j'extrait le début du fichier pour le stocker dans une String, ensuite j'analyse le contenu de cette String pour déterminer la version de RSS utilisée.

    Ensuite j'appelle un parser en fonction de la version utilisée (par exemple RSS_1_0 pour la version 1.0).

    Le problème c'est que là il va me manquer le début du flux, c'est à dire les octets déja lus.

    Donc en gros ma question c'est de savoir s'il y a pas un moyen plus propre que de re-récuperer le InputStream avec "new FileInputStream(File(path))", par exemple.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Points : 26
    Points
    26
    Par défaut
    Bon, je récapitule.
    Voilà mon code actuel:
    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
    public static RSSParser getParser(String path)
    	throws NullPointerException, FileNotFoundException, IOException, ParsingException
    	{
    		InputStream is;
    		InputStream in;
    		RSSParser rss = null;
     
    		if(path.startsWith("http://"))
    		{
    			URL url = new URL(path);
     
    			is = url.openStream();	
    			// Solution pas trés propre
    			in = url.openStream();		
    		}
    		else
    		{
    			is = new FileInputStream(new File(path));
    			// Solution pas trés propre
    			in = new FileInputStream(new File(path));
    		}
     
    		// Get the beginning of the stream to determine the RSS version used
    		byte[] buffer = new byte[512];
     
    		int bytesRead = 0;
     
    		while(bytesRead < 512) 
    		{
    			int bytes = in.read(buffer, bytesRead, 512 - bytesRead);
     
    			if(bytes == -1)
    			{
    				break;
    			}
     
    			bytesRead+= bytes;
    		}
     
    		String content = new String(buffer);
     
    		if(content.contains("xmlns=\"http://purl.org/rss/1.0/\""))
    		{
    			rss = new RSS_1_0(is);
    		}		
    		else if(content.contains("version=\"0.90\"") || content.contains("version=\"0.91\"") || content.contains("version=\"0.92\"") || content.contains("version=\"0.93\""))
    		{
    			rss = new RSS_0_9(is);
    		}
    		else if(content.contains("rss version=\"2.0\""))
    		{
    			rss = new RSS_2_0(is);
    		}
     
    		return rss;
    	}
    Maintenant j'aimerais savoir s'il y'a moyen de ne pas avoir deux InputStream (is et in) ?
    Parce que là si je prends qu'un seul InputStream pour déterminer la version ET pour le constructeur du parser, ben le parser ne recevra pas le début du InputStream.

    Une idée ?

    PS: j'ai testé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    byte[] buffer = new byte[512];
    		is.read(buffer, 0, buffer.length);
    et ça marche pas, en revanche avec ma boucle ça marche. Une idée du pourquoi du comment ?

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 872
    Points : 22 939
    Points
    22 939
    Billets dans le blog
    53
    Par défaut
    Si tu connaît à l'avance le nombre d'octets que tu doit lire, il n'y a aucune raison que tu face une boucle pour récupérer ton flux.
    Tss, il n'y a absolument aucune garantie que le tableau sera completement rempli en une seule fois.

    The number of bytes actually read is returned as an integer.
    ...
    An attempt is made to read as many as len bytes, but a smaller number may be read.
    Bien sur une raison simple evidente est que le fichier en question contient moins de donnees que prevu... mais la doc est volontairement dans le flou sur les raisons du pourquoi la valeur de retour peut etre plus petite que prevue.

    Ex : du au fait que quand tu as des instances concretes/especes de flux qui sont treeeeees lent (et/ou mal foutus), tu peux eventuellement avoir un timout qui se declenche durant la periode d'attente du remplissage. Comme ce n'est pas une erreur (pas de fin de flux, pas d'erreur de lecture et pas de rupture de connexion), il n'y a donc pas d'exception de lancee mais la methode retourne sans avoir lu la taille escomptee.

    D'ou l'interet dans les algo generiques de gestion de flux de toujours bien gerer cette valeur de retour.

  6. #6
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    Merci pour la précision

Discussions similaires

  1. question sur MFC class CAsynCSocket
    Par doommick31 dans le forum MFC
    Réponses: 2
    Dernier message: 06/05/2007, 11h51
  2. [stl] questions sur la classe string
    Par r0d dans le forum SL & STL
    Réponses: 3
    Dernier message: 23/02/2007, 01h31
  3. Question sur une classe <template>
    Par Pingva dans le forum C++
    Réponses: 1
    Dernier message: 26/01/2007, 18h16
  4. [C# 2.0] Question sur la classe SerialPort
    Par cyllix dans le forum Windows Forms
    Réponses: 4
    Dernier message: 11/09/2006, 09h51
  5. Question sur JDBC classe mysql
    Par oOoOuuhmAn dans le forum JDBC
    Réponses: 2
    Dernier message: 11/05/2006, 18h44

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