2017-06-19 2 views
0

Ich habe meine erweiterten Eingangsstrom, derUnterschied zwischen den folgenden Snippets. Wie wurden meine Eingabestream-Lesezyklen reduziert?

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 
} 

} 

Jetzt wie

FIRST TRAIL ist, wenn eine Datei zufrieden mit meinem DataReadInputStream innerhalb BufferedInputStream wie folgt

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); 
} 

Hinweis gewickelt lesen: Ich wickle meine DataReadInputStream innerhalb BufferedInputStream um die Anzahl der gelesenen Anrufe zu reduzieren (dh; BufferedInputStream f Übel, bis der Puffer es halten kann - was die Anzahl der Systemaufrufe reduziert), aber es liest nur 512 Bytes zu einer Zeit - hier konnte ich keinen Zweck Einwickeln sehen meine DataReadInputStream innerhalb BufferedInputStream

ZWEITER VERSUCH

ich versuche, das gleiche wie,

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); 
} 

} 

nun zu erreichen, wenn ich versuche, den Inhalt der Datei mit diesem DataReadInputStream zu lesen i zu einem Zeitpunkt 4096 Bytes entweder mit beiden i lesen konnte) und ii) (die ich gegeben wie meine Puffergröße hier)

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); 
}  

Mit ZWEITER VERSUCH die Anzahl der Lesezyklen bekam reduziert, was signifikant die Geschwindigkeit Datei herunterladen verbessert wie?

Jeder Rat in dieser Hinsicht wird sehr geschätzt! Danke :-)

+1

Keine Antwort auf die Frage, aber einige gute Ratschläge: 'public InputStream in = null;' sollte 'private' sein und muss nicht zweimal mit 'null' initialisiert werden. Überlege es, es "endgültig" zu machen. 'int BUF_LEN = 4096;' sollte nur in Großbuchstaben mit Unterstrichen benannt werden, wenn es "final" ist. Rufen Sie niemals eine überschreibbare Methode von einem Konstruktor auf! Warum ist alles "öffentlich"? Wie wird der Stream geschlossen? –

+0

@LewBloch Danke für das Aufzeigen .. 'Wie wird der Stream geschlossen?' - Ich habe nicht den vollständigen Code hinzugefügt - nur das Schnipsel hinzugefügt, um das Problem viel besser zu verstehen .. – Natasha

+0

Und die anderen Punkte? –

Antwort

0

Ihr erster Ansatz verwendet eine BufferedInputStream dann absichtlich die Pufferung mit benutzerdefinierten Pufferung und einem Low-Level read Aufruf besiegt. So hast du all die Gemeinkosten und keinen Vorteil.

Verwandte Themen