2011-05-06 5 views
0

J'utilise le message readFully de DataInputStream lire un tableau d'octets de longueur fixe comme:readFully de DataInputStream la requête

byte[] record = new byte[4660004]; 

in.readFully(record); 

Le problème ici est que, parfois, il faut plus de 5 secondes pour lire ces nombreux octets, ce qui est égal à 20000 enregistrements. Et je reçois ces données sur socket. Le client envoie des données sous la forme d'un tableau d'octets de 4660004 octets. Existe-t-il un moyen de recevoir ces données plus rapidement, puisqu'il faut environ 5 minutes à 1 million de ces enregistrements.

EDIT :: flux de données complète:

premier je crée le flux:

static DataInputStream dIn = null; 

dIn = new DataInputStream(connection.getInputStream()); 
msgType = dIn.readByte(); 

int msgIntLen = dIn.readInt(); 

processBatch(msgIntType, msgIntLen, dIn, connector); 

. 
. 

private static void processBatch(int msgIntType, int msgIntLen, DataInputStream in, 
      Connector connector) throws IOException { 

    int recordIntLen = in.readInt(); 
    byte[] record = new byte[msgIntLen - 4]; 
    in.readFully(record); 

} 

où dois-je inclure le tamponnage si cette aide wudf?

+0

Votre DataInputStream encapsule-t-il un BufferedInputStream? –

+0

@Nathan - pas. Comment puis-je faire ceci ? s'il vous plaît voir mon code dans EDIT pour voir comment je suis en train de traiter. – user656189

+0

Essayez ceci: 'dln = new DataInputStream (new java.io.BufferedInputStream (connection.getInputStream()));' –

Répondre

0

Les commentaires commencent à défiler, se déplaçant ainsi vers une réponse. Tamponnez votre sortie côté client à l'aide d'un BufferedOutputStream. Assurez-vous d'appeler dlOut.flush() après avoir écrit les données, afin que les octets non envoyés ne restent pas dans le flux de sortie mis en mémoire tampon. Tamponnez votre entrée côté client à l'aide d'un BufferedInputStream. Comme vous envoyez uniquement des tableaux d'octets, vous n'avez probablement pas besoin de DataInputStream/DataOuputStream, à moins que vous ne les utilisiez à d'autres fins. Vous pourriez simplement utiliser BufferedInputStream/BufferedOutputStream.

Questions connexes