2012-07-16 14 views

Odpowiedz

4

Nie należy mylić domyślnego zachowania metody InputStream i jej większości podklas. Zasada projektowania OO polega na tym, że podklasy mogą zmieniać zachowanie metody tej implementacji.

From InputStream - read (byte []) wywołuje read() wielokrotnie.

public int read(byte b[], int off, int len) throws IOException { 
    // code removed 

     for (; i < len ; i++) { 
      c = read(); 

    // code removed 
} 

From BufferedInputStream - read (byte []) nie wywołuje read().

public synchronized int read(byte b[], int off, int len) throws IOException { 
    // code removed 
     int nread = read1(b, off + n, len - n); 
    // code removed 
} 

private int read1(byte[] b, int off, int len) throws IOException { 
    // code removed 
      return getInIfOpen().read(b, off, len); 
    // code removed 
} 

Z FileInputStream - read (byte []) nie wywołuje read().

public int read(byte b[], int off, int len) throws IOException { 
    return readBytes(b, off, len); 
} 

private native int readBytes(byte b[], int off, int len) throws IOException; 

Podczas InputStream odczytuje jedną bajcie, prawie wszystkie realizacje przejdzie odczytu (bajt []) tego samego sposobu bazowego strumienia.

Uwaga: implementacje odczytu (bajt [], int, int) różnią się we wszystkich trzech przypadkach.

co mam na myśli jaśniej zadać to: Załóżmy, że chcę, aby odczytać 20 bajtów, Reading jeden bajt na raz trafi bazowy strumień (np system plików), za każdym razem w pętli co oznacza 20 razy .. ok Teraz czytając tablicę 20 bajtów za jednym zamachem, tj. za pomocą odczytu (bajt [] 20), Teraz będzie to hit strumieniem bazowym (np. system plików) jeden raz lub 20 razy ... ?? (jak podano: read (byte [] b) metoda będzie również wywoływała metodę read() wielokrotnie 20 razy)?

Czy korzystasz BufferedInputStream lub FileInputStream jeden read (byte []) powoduje atmost wezwanie jednego systemu do odczytu do byte [].

+0

PeterLawrey: Dzięki za tak dobrze wyodrębnione wyjaśnienie. Czyli to oznacza, że ​​wszystkie 3 metody InputStream będą odczytywać na poziomie jednego bajtu na raz, niezależnie od liczby bajtów, które określamy w bajcie (bajt [])? –

+2

Nie, staram się wykazać szczegółowo i szczegółowo, dlaczego tak nie jest. Nie jest dla mnie jasne, dlaczego mógłbyś tak sądzić. –

+0

Dzięki .. Teraz mam to .. –

2

Użyj tego, co uznasz za najwygodniejsze w swoim przypadku, ale pamiętaj, aby zawinąć numer InputStream za pomocą BufferedInputStream.

Bez buforowania pojedynczego read() trafi strumień bazowy (np. System plików) za każdym razem, gdy czytasz. Z buforowaniem ten sam read() ładuje porcję (na przykład 4KB) i ją buforuje. Oczywiście odczyt z dysku (nawet jeśli niektóre z buforów OS/dysku twardego z dolną dźwignią są obecne) jest znacznie wolniejszy.

Dlatego jest lepszy tylko wtedy, gdy strumień nie jest buforowany - lub jeśli naprawdę chcesz przeczytać więcej niż jeden bajt.

+0

Czytanie go po znaku/bajcie na raz (to jest InputStream.read()), lub odczytywanie tablicy bajtów/znaków po bloku na raz .. Jaka jest różnica podczas odczytu (byte [] b) metoda będzie również wywoływać metodę read() wielokrotnie tablica bajtów/char blok zadeklarowany razy? –

+0

@ Tomasz Nurkiewicz: dziękuję, ale wykluczam przypadek BufferedInputStream. Jeśli mówimy tylko o InputStream..wtedy obie metody przyniosłyby taką samą wydajność. Czy to prawda? –

+0

@AshishKataria Powtarzasz tutaj oryginalne pytanie, a on już na nie odpowiedział. Jeśli wstawiasz 'BufferedInputStream,' nie ma operacji odczytu jednobajtowego w operacji, która jest tym, dla czego jest przeznaczona. – EJP

Powiązane problemy