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 :-)
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? –
@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
Und die anderen Punkte? –