2017-06-19 3 views
0

J'ai mon flux d'entrée étendue qui est commeDifférence entre les extraits suivants. Comment mon flux d'entrée a-t-il lu les cycles a été réduit?

PREMIER TRAIL

public class DataReadInputStream extends java.io.InputStream{ 

private InputStream in = null; 
public DataReadInputStream(boolean decompress) { 
initInputStream(); 
} 
//Contains other read methods from which are in InputStream 

public int read(byte[] arr, int offset, int length) { 
return this.in.read(arr, offset, length); 
} 

public void initInputStream(boolean decompress) { 
//this.in contains some input stream value 
this.in = decompress ? new GZIPInputStream(this.in) : this.in; 
// NOTE: GZIPInputStream reads only 512 bytes at a time since the default buffer size in GZIPInputStream is 512 
} 

} 

maintenant lors de la lecture d'un contenu de fichier avec mon DataReadInputStream enveloppé dans les BufferedInputStream comme ce qui suit

ins = new DataReadInputStream(true); 
bis = new BufferedInputStream(ins); 
servletOutStream = res.getOutputStream(); 

int c = 0; 
int len = 4096; 
byte bufr[] = new byte[len]; 
while ((c = bis.read(bufr, 0, len)) != -1) { 
    servletOutStream.write(bufr, 0, c); 
} 

Note: J'emballe mon DataReadInputStream au sein de BufferedInputStream pour réduire le nombre d'appels de lecture (par exemple, BufferedInputStream f maux le tampon jusqu'à ce qu'il peut contenir - ce qui réduit le nombre d'appels système), mais il ne lit que 512 octets à la fois - ici je ne pouvais voir aucune raison d'envelopper mon DataReadInputStream dans les BufferedInputStream

ESSAI DEUXIÈME

Je suis en train de réaliser le même comme,

public class DataReadInputStream extends java.io.InputStream{ 

public BufferedInputStream in = null; 
public DataReadInputStream(boolean decompress) { 
initInputStream(); 
} 
//Contains other read methods from which are in InputStream 

public int read(byte[] arr, int offset, int length) { 
return this.in.read(arr, offset, length); 
} 

public void initInputStream(boolean decompress) { 
InputStream ins = decompress ? new GZIPInputStream(this.in) : this.in; 
this.in = new BufferedInputStream(ins); 
} 

} 

maintenant, quand j'essaie de lire le contenu du fichier avec ce DataReadInputStream je pouvais lire 4096 octets à la fois soit à la fois i) et ii) (que j'ai donné comme ma taille de tampon ici)

i)

ins = new DataReadInputStream(true); 
bis = new BufferedInputStream(ins); 
servletOutStream = res.getOutputStream(); 

int c = 0; 
int len = 4096; 
byte bufr[] = new byte[len]; 
while ((c = bis.read(bufr, 0, len)) != -1) { 
    servletOutStream.write(bufr, 0, c); 
} 

ii)

ins = new DataReadInputStream(true); 
servletOutStream = res.getOutputStream(); 

int c = 0; 
int len = 4096; 
byte bufr[] = new byte[len]; 
while ((c = ins.read(bufr, 0, len)) != -1) { 
    servletOutStream.write(bufr, 0, c); 
}  

Avec DEUXIÈME ESSAI le nombre de cycles de lecture réduit obtenu ce qui améliore considérablement la vitesse de téléchargement fichier comment?

Tout conseil à cet égard est grandement apprécié! Merci :-)

+1

Pas une réponse à la question, mais un bon conseil: 'public InputStream in = null;' devrait être 'private' et n'a pas besoin d'être initialisé à' null' deux fois. Envisagez de le rendre 'final'. 'int BUF_LEN = 4096;' ne devrait être nommé qu'en majuscule avec des traits de soulignement si c'est 'final'. Ne jamais appeler une méthode remplaçable d'un constructeur! Pourquoi tout est-il public? Comment le flux se ferme-t-il? –

+0

@LewBloch Merci de souligner ... 'Comment le flux se ferme-t-il?' - Je n'ai pas ajouté le code complet - juste ajouté l'extrait pour mieux comprendre le problème .. – Natasha

+0

Et les autres points? –

Répondre

0

Votre première approche utilise un BufferedInputStream alors intentionnellement vainc la mise en mémoire tampon en utilisant la mise en mémoire tampon personnalisée et un appel read de bas niveau. Ainsi vous avez tous les frais généraux et aucun de l'avantage.