InpuStream - metoda available, która zwraca 0

0

Mam taką metodkę:

public ZipFile metodaZipFile(InputStream documentInputStream) throws IOException {
        byte[] buffer = new byte[documentInputStream.available()];
        documentInputStream.read(buffer);
        documentInputStream.close();
        File file = new File("test.tmp");
        OutputStream outputStream = new FileOutputStream(file);
        outputStream.write(buffer);}
        return new ZipFile(file);
    }
} 

Czytając dokumentację metody "available" i goglując mam mieszane uczucie. Nie do końca rozumiem jak to działa, a jakoś przykładów w sieci jak na lekarstwo. Metoda ta zwraca 0. Czyli, żeby ten kawałek kodu działał trzeba zrobić @Override tej metody, tak? Czy jakaś magia tu się odbywa? Czy ten wklejony kawałek kodu ma prawo działać?

0

Fajna ta metoda, taka nie kompilująca się bo jest za dużo klamerek zamykających, tak o dwie za dużo. Załóżmy że ta metoda wygląda tak:

public ZipFile metodaZipFile(InputStream documentInputStream)
throws IOException {
    byte[] buffer = new byte[documentInputStream.available()];
    documentInputStream.read(buffer);
    documentInputStream.close();
    File file = new File("test.tmp");
    OutputStream outputStream = new FileOutputStream(file);
    outputStream.write(buffer);
    return new ZipFile(file);
}

Metoda ta zwraca 0. Czyli, żeby ten kawałek kodu działał trzeba zrobić @Override tej metody, tak?

Ale jaki kawełek? metodę w istniejącym cudzym obiekcie chcesz nadpisywać?
A czytałeś co znaczy to 0?

Returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking, which may be 0, or 0 when end of stream is detected

Czyli w tej chwili nie ma żadnych bajtów które można odczytać bez blokowania. Możeliwe też że strumień się skończył i nic już nie zostanie odczytane.

A linijke dalej jest jeszcze ciekawiej

It is never correct to use the return value of this method to allocate a buffer intended to hold all data in this stream.

Czyli jest prosto napisane że kod byte[] buffer = new byte[documentInputStream.available()] jest błędny

UPDATE widzę że to co tychcesz zrobić to Write a Java InputStream to an OutputStream, czyli:

  try (OutputStream targetStream = new FileOutputStream(file)) {
    inputStream.transferTo(targetStream);
  }
0

Dzięki Kamil za konkret. A tak wygląda definicja tej metody:

public int available() throws IOException {
    return 0;
}
0
Kiko88 napisał(a):

Kamil, dzięki za konkret, ale zobacz tutaj. Tak wygląda ciało tej metody na starcie:

public int available() throws IOException {
    return 0;
}

Tak i to jest nawet opisane w dokumentacji

The available method for class InputStream always returns 0.
This method should be overridden by subclasses.

Ale ty pewnie nie używasz instancji klasy InputStream tylko jakiejś podklasy gdzie jest zmeiniona implementacjia jak np FileInputStream czy ByteArrayInputStream. Zresztą jaka ta implementacja by nie była używanie available do określenia wielkości bufora jest błędem

0

Spoko, dzięki - jaśniej, ale jeszcze żeby to zrozumień muszę na przykładzie obczaić... Jakby ktoś miał coś ciekawego w tym temacie, to chętnie przygarnę..

1 użytkowników online, w tym zalogowanych: 0, gości: 1