LEcture et transfert de fichier

Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 septembre 2008 - 2 nov. 2007 à 09:10
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 - 5 nov. 2007 à 00:55
Bonjour,

je suis actuellement en train d'essayer de développer une application qui envoit un fichier d'un pc à un autre en réseau local. J'initie le transfert avec une séquence de ce type :

FILE [nomfichier][taillefichier][nombremorceau][rest]

J'ai une constante splitLength définie sur 2048 qui définit la taille des morceaux. Donc nombremorceau désigne en combien de morceaux le fichier va être découpé et rest désigne le nombre d'octets restants après les nombremorceau morceaux.

Le progamme le recoit donc bien, ensuite voici l'algorithme d'envoi :

try {

    BufferedReader buffer = new BufferedReader(new InputStreamReader(new FileInputStream(path)));
    out.print("FILE [" + fileName + "][" + length + "][" + number + "][" + rest +"]");
    out.flush();

    for (int x = 0; x < number; ++x) {
 
        buffer.read(str, 0, splitLength);
        out.print(str);
        out.flush();

    }

    buffer.read(strRest, 0, rest);
    out.print(strRest);
    out.flush();

}
catch (Exception e) {

    System.err.println(e);
    e.printStackTrace();

}

Apparemment l'envoi se passe bien car quand j'affiche ce qui a été envoyé, tout est bien affiché, le problème est qu'à la réception, il ne récupère pas les 4 derniers octets. Donc si je met une suite de

Jean-claude
Jean-claude
Jean-claude

Ca arrivera en

Jean-claude
Jean-claude
Jean-cl

Mais étonamment, le fichier fait la meme taille o_O Voici le code à la réception :

char[] str = new char[splitLength];
char[] strRest = new char[rest];
       
try {
           
    PrintWriter f = new PrintWriter(new BufferedWriter(new FileWriter("/home/zick/Desktop/" + path)));
       
    for (int x = 0; x < number; ++x) {

        in.read(str, 0, splitLength);
        f.print(str);
        f.flush();

    }
           
    in.read(strRest, 0, rest);
    f.print(strRest);
    f.flush();
          
}
       
catch (Exception e) {}

Donc voilà un peu mon soucis :p

Un autre truc bizarre, quand le fichier contient des caractères accentués, là, c'est vraiment la cata mais je reviendrai avec ca quand j'aurais réglé ce problème la déjà... Avec votre aide je pense bien :p

Merci d'avance

Apprendre le VB6

7 réponses

indiana_jules Messages postés 750 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 23 décembre 2008 22
2 nov. 2007 à 15:01
Salut
pour les caractéres, c'est normal, il faut que tu précises à ton flux de réception quel type de codage il s'agit (UTF-8 ...)
pour le reste, je pense que dans ta boucle, il faudrait mieux faire un x++ qu'un ++x

Voili voilà

le monde a des idées : la preuve, c'est qu'il y en a de mauvaises
ne comprends pas tout, mais je parle de tout : c'est ce qui compte
0
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 septembre 2008
2 nov. 2007 à 16:06
Salut,

le charset de mes sockets est bien UTF-8, donc c'est ca que je comprend pas car ca devrait aller niquel.

Quant à ta solution sur mon incrémentation de x, je vois pas trop le rapport, mais je vais essayer :p

J'ai toujours fait avec ++x et ca a toujours fonctionné donc bon, je vous tiens au courant

Apprendre le VB6
0
z bozzo Messages postés 34 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 15 novembre 2007
2 nov. 2007 à 17:53
Salut,


Pour avoir passé du temps sur les problemes d'encoding, je te conseille de bien verifier l'encoding d'envoi et celui d'arrivé. Ce n'ai pas obligé qu'ils soient en UTF-8, tu peu les avoir en iso-8859-1, ASCII, ... il faut juste qu'ils soient identiques c'est a dire si ton fichier est en UTF-8 tu doit le receptionner en UTF-8 par exemple.

Pour tes 4octets: deja de faire ++x (pre incrementation) te fait demarer un rang plus loin (pas de x = 0). tu peut essayer de tester la fin de fichier:

while ( nbOctetsLus > -1 )
{
    ...
    // InputStreamReader.read() renvoi le nombre d'octet lus ou -1 si fin de fichier
    // equivalent au EOF en C.
    nbOctetsLus  = in.read(str, 0, splitLength);
    ...
}

<hr size ="2" width="100%" />

- Bozzo -  
0
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 septembre 2008
2 nov. 2007 à 19:02
Re bonjour,

alors, niveau du charset j'ai bien vérifié, j'ai mis UTF-8 partout. J'ai quand meme essayé avec le x++ à la palce du ++x mais ca ne change rien... C'est logique, ca ne fait pas démarrer un rang plus loin vu que ca s'exécute après les instructions, ++x est juste plus performant que x++.

Pour le test de la fin du fichier, je ne l'ai pas fait, mais je suis sur qu'il arrive à la fin car j'ai affiché strRest et là le Jean-claude de la fin est complet...

C'est vraiment à la réception que ca foire...

Apprendre le VB6
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 septembre 2008
2 nov. 2007 à 20:45
En passant :

un truc vraiment étrange lié au flux je pense. Du coté du serveur, j'ai fait

System.out.print(str);

dans le boucle et

System.out.print(strRest);

Pour le dernier bloc et là, dans mon fichier les données sont corrects, si j'enleve ces printf, les données redeviennent corrompues...

Apprendre le VB6
0
Ziman Messages postés 245 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 26 septembre 2008
2 nov. 2007 à 20:59
Désolé de faire 3 posts de suite mais j'ai pas trouvé de fonction editer :

J'ai trouvé la solution, je met un

Thread.sleep(10);

pour attendre l'écriture et ca fonctionne niquel...

Apprendre le VB6
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
5 nov. 2007 à 00:55
ya plein de code qui te permlettent de le faire sur le site
"pour le reste, je pense que dans ta boucle, il faudrait mieux faire un x++ qu'un ++x" = > non il a raison ++x est plus optimise

essai de voir si tu split pas un caractere de plus que ce que tu devrais ou si tu cree pas un decallage sinon je suis d'ac avec z_bozzo et tester la fin du fichier pour l'envois

j'ai deux morceaux de code ici
:

public
File
receivedFile (String
name)
{

<gras>this
.stopManagerRead();

File
dest
=
new
File(name);

try
{

FileOutputStream
fout
=
new
FileOutputStream(dest);

InputStream
in
=
activeConnection.getInputStream();

byte[]
buff
=
new
byte[512];

int
r
=
in.read(buff);

while
(r
>
-1)
{

fout.write(buff,
0,
r);

if
(r
<
512)

break;

r
=
in.read(buff);

}

fout.close();

}
catch
(FileNotFoundException
e)
{

e.printStackTrace();

}
catch
(IOException
e)
{

e.printStackTrace();

}

return
dest;

}/*******************/

public
synchronized
boolean
sendFile (File
file)
{

<gras>try

{

FileInputStream
in
=
new
FileInputStream(file);

byte[]
buff
=
new
byte[512];

int
read
=
in.read(buff);

// BufferedOutputStream bout = new BufferedOutputStream(out);

while
(read
>
0)
{

outstream.write(buff,
0,
read);

read
=
in.read(buff);

}

return
true;

}
catch
(FileNotFoundException
e)
{

e.printStackTrace();

}
catch
(IOException
e)
{

e.printStackTrace();

}

return
false;

}

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
Rejoignez-nous