LEcture et transfert de fichier

Messages postés
247
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2008
- - Dernière réponse : sheorogath
Messages postés
2465
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
Afficher la suite 

7 réponses

Messages postés
750
Date d'inscription
mardi 9 mars 2004
Statut
Membre
Dernière intervention
23 décembre 2008
17
0
Merci
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
Commenter la réponse de indiana_jules
Messages postés
247
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2008
0
Merci
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
Commenter la réponse de Ziman
Messages postés
34
Date d'inscription
lundi 19 mars 2007
Statut
Membre
Dernière intervention
15 novembre 2007
0
Merci
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 -  
Commenter la réponse de z bozzo
Messages postés
247
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2008
0
Merci
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
Commenter la réponse de Ziman
Messages postés
247
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2008
0
Merci
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
Commenter la réponse de Ziman
Messages postés
247
Date d'inscription
dimanche 27 avril 2003
Statut
Membre
Dernière intervention
26 septembre 2008
0
Merci
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
Commenter la réponse de Ziman
Messages postés
2465
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
11
0
Merci
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"
Commenter la réponse de sheorogath