2016-04-30 2 views
1

Quelle est la bonne façon de lire les fichiers de la socket? Parce que la boucle de lecture du fichier ne se termine pas même si du côté client, l'écriture des fichiers est terminée. J'ai même essayé d'imprimer la position et la longueur du tampon si j'ai encore des données à lire.Quelle est la bonne façon de lire les fichiers depuis le socket?

Voici mon code pour lire le fichier.

private void readActualData(SocketChannel socketChannel) { 
    RandomAccessFile aFile = null; 
    System.out.println("Reading actual Data"); 
    try { 
     aFile = new RandomAccessFile(path, "rw"); 
     ByteBuffer buffer = ByteBuffer.allocate(50000000); 
     FileChannel fileChannel = aFile.getChannel(); 

     int length; 

     while ((length = socketChannel.read(buffer)) >= 0 || buffer.position() > 0) { 
      buffer.flip(); 
      fileChannel.write(buffer); 
      buffer.compact(); 
      System.out.println("Length : "+length+" and Buffer position : "+buffer.position()); 
     } 
     fileChannel.close(); 
     System.out.println("End of file reached..Done Reading"); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Répondre

3

Ce code suppose que le pair ferme le socket lorsque le fichier a été complètement envoyé. Si ce n'est pas le cas, vous avez besoin de quelque chose de beaucoup plus complexe, en commençant par transmettre la longueur du fichier avant le fichier et en limitant ensuite la quantité lue depuis le socket à exactement cette longueur. J'ai fourni un exemple pour les sockets en mode de blocage here, mais l'adapter à NIO est non trivial.

+0

J'ai réfléchi à ce que vous deviez faire dans le cas de plusieurs fichiers. Vous devez compter la longueur initiale du fichier et quand ce qui reste à lire devient inférieur à buffer.limit() - buffer.position() 'à la fin de la boucle de lecture, vous devez ajuster la limite du buffer tel qu'il ne l'est pas. – EJP