2012-05-12 3 views
0

Je suis en train de transférer le fichier par socket dans java..en fait, j'ai été en mesure de transférer..mais il y a un problème survenu..le problème est le fichier envoyé est de taille réduite .. par exemple i transfert de fichiers de 300 Mo, le client ne recevra que 299mb .... je me demandais ce qui pourrait être le problème ..transférer le fichier par socket en Java

côté serveur

File myFile = new File (basePath+"\\"+input.readUTF()); 
byte [] mybytearray = new byte [1024]; 
FileInputStream fis = new FileInputStream(myFile); 
BufferedInputStream bis = new BufferedInputStream(fis); 
txtArea.append("Sending... \n"); 
while (true) 
{ 
    int i = bis.read(mybytearray, 0, mybytearray.length); 
      if (i == -1) { 
     break; 
    } 
    output.write(mybytearray, 0, i); 
    txtArea.append("Sending chunk " + i + "\n"); 

} 
output.flush(); 

côté client

output.writeUTF("get"); 
txtArea.append("Starting to recive file... \n"); 
       long start = System.currentTimeMillis(); 
       byte [] mybytearray = new byte [1024]; 
       txtArea.append("Connecting... \n"); 
       output.writeUTF(remoteSelection); 
       FileOutputStream fos = new FileOutputStream(basePath+"\\"+remoteSelection); 
       BufferedOutputStream bos = new BufferedOutputStream(fos); 
       int bytesRead = input.read(mybytearray, 0, mybytearray.length); 
       while(bytesRead != -1) 
       { 
        bos.write(mybytearray, 0, bytesRead); 
        txtArea.append("got chunk" + bytesRead +"\n"); 
        bytesRead = input.read(mybytearray, 0, mybytearray.length); 
       } 
bos.flush(); 
+5

Vous devez vérifier -1 avant l'écriture, pas après. Vous utilisez aussi abuse() d'une manière spécifiquement mise en garde dans le Javadoc; vous supposez que la taille du fichier correspond à un int; etc etc – EJP

+0

Ajouter à ce que EJP a souligné, vous vérifiez également disponible sur un BufferedInputStream, je suppose qu'il renvoie seulement la longueur de tampon du flux d'entrée sous-jacent au plus. – dragon66

+0

alors comment puis-je vérifier la taille du fichier? j'essaie d'utiliser byte [] mybytearray = new byte [(int) myFile.length()]; avant ... mais il renvoie une erreur .. il est hors de tas quand j'essaye d'envoyer un gros fichier .. comme 600mb .. –

Répondre

2

le La façon canonique de copier un flux en Java est la suivante:

int count; 
byte[] buffer = new byte[8192]; // or whatever you like really, not too small 
while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 

Fonctionne pour toute entrée de longueur; ne charge pas toute l'entrée en mémoire; n'ajoute pas de latence en le faisant.

Si vous envoyez plus d'un fichier, vous devez d'abord envoyer la longueur via DataOutputStream.writeLong(); le lire à l'autre extrémité via la fonction inverse; et ajustez la condition de la boucle à la fin de la lecture pour terminer après avoir lu exactement autant d'octets. Pas tout à fait aussi simple que cela puisse paraître; laissé comme un exercice pour le lecteur.

+0

comment puis-je vérifier la longueur du fichier? –

+0

@BobyHartanto Err, 'File.length()?' – EJP

+0

merci pour l'aide –