Bonjour,
J'aimerais savoir comment je peux définir un encodage précis à mon flux de sortie de mon socket ?
Est-ce que quelqu'un a une idée ?
Merci d'avance
Bonjour,
J'aimerais savoir comment je peux définir un encodage précis à mon flux de sortie de mon socket ?
Est-ce que quelqu'un a une idée ?
Merci d'avance
Salut,
Utilises un OutputStreamWriter...
a++
OK merci c'est la solution que pour laquelle j'ai opté.
En fait, je me suis trompée, il ne s'agissait pas du flux de sortie mais plutôt du flux d'entrée donc j'ai crée un InputStreamReader pour récupère la réponse du socket.
Maintenant ce que je dois faire c'est stocker ce flux dans un fichier.
En fait, c'est la réponse d'une requête HTTP avec un transfer-encoding: chunked.
Ce que je fais c'est que je lis mon flux, je récupère la taille du paquet que je convertis. Et là, je crée un buffer de char[] qui a comme taille, celle du paquet (un buffer de Char[] et pas de byte[] à cause du InputStreamReader).
Le problème qui reste maintenant c'est au niveau du buffer. Je lui crée un buffer de la taille de la réponse mais celui-ci ne lit pas tout... il s'arrête en plein milieu d'une ligne donc je ne peux pas récupérer tout d'un coup.
Est-ce que quelqu'un voit ?
Dans ce cas n'utilise pas un Reader, utilise InputStream directement. Les chunks sont transmis en indiquant une taille en octets, et il est primordial de respecter cette taille en octets. Normalement ça ne peut se faire qu'en lisant des octets et non des caractères.
Ça demande un peu de travail pour parser les headers de chunks, mais c'est pas la mer à boire non plus.
Oublie. Il y a forcément de nombreux cas où ça ne marche pas. Fais avec InputStream. Quand tu as un paquet à lire, lit des octets jusqu'à détecter une fin de ligne, puis transforme les octets lus dans cette ligne en une String composée des caractères ASCII, et parse la taille en octet. Ensuite, lis autant d'octets.Ce que je fais c'est que je lis mon flux, je récupère la taille du paquet que je convertis. Et là, je crée un buffer de char[] qui a comme taille, celle du paquet (un buffer de Char[] et pas de byte[] à cause du InputStreamReader).
À noter que HttpClient et son ChunkedInputStream font très bien ça tous seuls.
C'est normal. Déjà il ne faut pas lire des caractères quand on veut des octets. Ensuite, read() ne lit pas exactement la taille du buffer, il lit au plus la taille du buffer. Le nombre d'octets lus est la valeur renvoyée par read(). Il faut donc appeler read() (avec l'offset et le nombre max adaptés) jusqu'à ce que le buffer soit rempli.Le problème qui reste maintenant c'est au niveau du buffer. Je lui crée un buffer de la taille de la réponse mais celui-ci ne lit pas tout...
N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
un read(buffer,debut,fin) te renvoie le nombre d'octet qu'il à effecivement reçu.
Donc il te suffit de n'ecrire que les octet reçus.
Exemple:
Ce code te permet d'afficher dans la console ce que tu lis sur le socket.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 int nbOctet; BufferedInputStream bis; byte buffer=new byte[256];// à toi de voir la taille que tu as besoin Socket monSocket; //... du code... bis=new BufferedInputStream(monSocket.getInputStream()); while((nbOctet=bis.read(buffer,0,buffer.length))!=-1){ for(int cpt=0;cpt<nbOctet;cpt++){ System.out.print(buffer[cpt]); } }
bon il manque les bloc try/catch mais je vais qd même te laisser chercher un peu.
Le fait que ca arrive pas forcement d'un coup est normal... mais je saurai pas te l'expliquer.
La javaDoc est mon amie, elle est la tienne aussi!
@thelvin
en fait, je crois que je n'ai pas le choix d'utiliser un IntputStreamReader pour des soucis d'encodage d'accents et autre.
Du coup, si j'utilises un InputStreamReader je dois utiliser un FileWriter pour mon fichier dans lequel je dois stocker le contenu du paquet.
comment faire...
Je suis à peu près sûr que ça n'a aucun rapport.
Si tout ce que tu as à faire est d'enregistrer la réponse dans un fichier, les accents et les caractères ne sont pas ton problème. Ça pourrait aussi bien être un MP3 ou un divX. Tu n'as besoin de voir que les octets. Tu *dois* ne voir que les octets. Si ton flux est en utf-8, un même caractère accentué pourrait très bien être coupé entre deux chunks.
(Bon, sauf si tu as besoin de faire une conversion de charset à la volée, auquel cas c'est plus compliqué, oui, il faut d'abord récupérer les octets, puis les encapsuler dans un InputStreamReader, et enregistrer le tout dans un FileReader. Si c'est le cas, ça devient un joli cas d'école.)
N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
bon d'accord pour l'encodage. Là, j'ai un autre souci parce que je n'obtiens toujours pas le bon résultat. Ce que je fais :
- je boucle tant que ma ligne est différente de "0" (le fameux 0 de fin de transfer-encoding: chunked)
- je lis la première ligne ce qui me permet de récupérer la taille du paquet
- je crée un buffer de byte qui a pour taille la taille que je viens de définir juste au-dessus
-je boucle sur : je lis mon input avec la méthode octet_lu = read(buffer, off, len); tant que octet_lu != -1 (fin du buffer), j'écris ce qui est lu dans mon fichier (FileOutputStream) myFile.write(buffer, 0, octet_lu);
- je fais un flush sur mon fichier.
j'arrive à obtenir mon fichier le problème c'est que je stocke aussi le 0 et le \r\n
comment faire ?
P.S : pour une image qui se trouve dans un script php, ça fonctionne cette méthode là mais pourquoi sur ma page html ça m'écrit le 0 et le reste ?
Je dirais repense ta boucle pour ne pas inclure le 0 et le \r\n. Je ne sais pas trop comment tu t'es débrouillée pour l'inclure.
Je recommande à nouveau de ne pas s'embêter à programmer ça et de juste réutiliser le ChunkedInputStream de commons-httpClient :
http://hc.apache.org/httpclient-3.x/...putStream.html
N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager