[ObjectInputStream/ObjectOutputStream]écrire un object au fur et à mesure[:)]

Frouf85 Messages postés 106 Date d'inscription mardi 6 mai 2003 Statut Membre Dernière intervention 7 octobre 2004 - 23 août 2004 à 08:53
Frouf85 Messages postés 106 Date d'inscription mardi 6 mai 2003 Statut Membre Dernière intervention 7 octobre 2004 - 2 nov. 2004 à 10:59
Salut,

Bon voila, j'ai un petit pb, si quelqu'un pouvais me sortir de cette M%$#€ ça serait cool.

Donc voila, je possède une application cliente et une application serveur qui communique en s'envoyant des object grâce à ObjectOutputStream et ObjectInputStream. Cest objects peuvent autant être des messages que des fichiers.

C'est sur ce deuxième point que les problèmes se posent. En fait, l'envoi de fichiers de trop grande taille me provoque une exception du type OutOfMemory, ce qui est tout à fait compréhensible vu le peu de mémoire vive qu'il y a sur les PC.

Je voulais donc savoir comment envoyer ces fichiers de grande taille en utilisant ObjectOutputStream et ObjectInputStream.
Est-il possible de les envoyer byte par byte et de les récupérer par la suite?
Sachant que pour déclencher la réception d'un object, je faisait un readObject qui est bloquant, comment pourrais-je faire par la suite?

Si tu as une réponse même si elle ne répond pas à toutes mes questions n'hésite pas, je susi à l'écoute.

Merci, :)

Frouf

6 réponses

wargre Messages postés 649 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 9 septembre 2004 7
23 août 2004 à 09:23
tu decoupe ton fichier en tranche de 1Mo et hop le tour est joue....
0
Frouf85 Messages postés 106 Date d'inscription mardi 6 mai 2003 Statut Membre Dernière intervention 7 octobre 2004
23 août 2004 à 09:28
Tu veux me dire d'envoyer plusieurs Object contenant chacune une tranche de fichier. C'est pas bête merci. Je vais tester, pour voir comment le découper et le recontruire après.

Frouf
0
Frouf85 Messages postés 106 Date d'inscription mardi 6 mai 2003 Statut Membre Dernière intervention 7 octobre 2004
25 août 2004 à 16:39
Bon ben je viens d'essayer et j'ai essayé de retourner le pb sous toutes les coutures mais ça ne marche toujours pas il me met java.lang.outOfMemory error.

Voila une partie de mon code:

//j'obtiens l'adresse absolue de mon fichier (ça marche)
String adresseFichier=config.getAdresseSMQ()+File.separator+(String)((Vector)objectTransmis.getContenu()).elementAt(0);


//j'ouvre donc un FileInputStream pour lire mon fichier byte par byte
FileInputStream fichierADecouper=new FileInputStream(config.getAdresseSMQ()+File.separator+(String)((Vector)objectTransmis.getContenu()).elementAt(0));

//je détermine combien il y aura de paquet à envoyer
int tailleFichier=fichierADecouper.available();
int nbPaquet=(new Double(StrictMath.ceil(tailleFichier*1.0/TAILLEPAQUER))).intValue();


//je cré le premier objet à envoyer qui déterminera combien il y aura de paquet, le nom du fichier et sa date de création
Vector oldContenu=(Vector)objectTransmis.getContenu();
Vector contenu=new Vector();
contenu.add(oldContenu.elementAt(0));
contenu.add(oldContenu.elementAt(1));
contenu.add(oldContenu.elementAt(2));
contenu.add(new Integer(nbPaquet));
objectTransmis=new ObjectTransmis("envoiFichier",contenu);

//j'ajoute ce premier objet dans le vector qui contient tous les objets à envoyer ( ce vector est limité en taille ) le pb ne vient donc pas de là
objectATransmettres.add(objectTransmis);
aTransmettre++;

//je crée chaque tronçon de fichier à partir du FileInputStream
int[] tranche;
Vector trancheVec;
for (int i=0;i<nbPaquet;i++){
   //vérification que le vecteur d'attente d'envoi n'est pas plein    
   while(MAXSIZE==objectATransmettres.size()){		System.out.println("vector rempli");
try {
                	wait(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
                }
   tranche=new int[TAILLEPAQUER];
   int byteFichier=-1;
   for (int j=0;j<tranche.length;j++){
        byteFichier=fichierADecouper.read();
        tranche[j]=byteFichier;
   }
    trancheVec=new Vector(3);
    trancheVec.add((String)((Vector)objectTransmis.getContenu()).elementAt(0));
    trancheVec.add(new Integer(i));
    trancheVec.add(tranche);
    objectTransmis=new ObjectTransmis("envoiFichier",trancheVec);
    objectATransmettres.add(objectTransmis);
    aTransmettre++;
}


et donc comme ça il arrive à m'envoyer 14,7 Mo (j'envoi des paquet de 1000000 de d'octets).

Je me posais donc la question: ouvre t-il le fichier au fur et à mesure qu'il lit dans le FileInputStream? Dans ce cas, ce n'est pas bon, parce qu'un fichier qui fait plus de 650 Mo par exemple, il ne pourra pas l'ouvrir entièrement.

aurais-tu une réponse voire une solution.

merci,

Frouf
0
Frouf85 Messages postés 106 Date d'inscription mardi 6 mai 2003 Statut Membre Dernière intervention 7 octobre 2004
26 août 2004 à 10:45
Mon pb est à moitié résolu, en utilisant des fileChannel, j'ai réussi à passe 58Mo mais je ne sais pas pourquoi il me fait cette erreur de java.lang.outOfMemory.
Si j'ai la réponse un jour, je la posterais sur ce forum.

Frouf
0

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

Posez votre question
cs_AbriBus Messages postés 492 Date d'inscription jeudi 28 août 2003 Statut Membre Dernière intervention 25 avril 2007 5
30 oct. 2004 à 09:49
Salut Frouf, as tu trouvé une reponse a cette question... est-elle toujours d'actualité ?

Que la prog soit avec toi...

Bubus...
0
Frouf85 Messages postés 106 Date d'inscription mardi 6 mai 2003 Statut Membre Dernière intervention 7 octobre 2004
2 nov. 2004 à 10:59
Non, désolé, je n'ai trouvé aucune réponse de plus.
Bonne chance et si tu trouve n'hésite pas à le poster.

Frouf
0
Rejoignez-nous