About abstract method read() in class InputStream
I would like to know if behind the method
public abstract int read() throws IOException
in the abstract class InputStream there is some code that
is called when I have to read a stream. In this case where can I find
something about this code and, if is written in other languages, why
is not present the key wordnative?
Thanks for yours answers and sorry for my bad english.
[433 byte] By [
speculora] at [2007-11-27 10:02:59]

abstract means that it is not implemented in the class InputStream, but that classes that extend InputStream must implement it.
, why
> is not present the key word native?
It is
/**
* Reads a byte of data from this input stream. This method blocks
* if no input is yet available.
*
* @returnthe next byte of data, or <code>-1</code> if the end of the
* file is reached.
* @exception IOException if an I/O error occurs.
*/
public native int read() throws IOException;
Check out the src for something which implements the abstract method such as FileInputStream.
Are you sure, curry_monster, that is enough an implementation of that method in only one subclass like FileInputStream and so all the other subclasses can look at that native implementation? May be I need to do a little model where this is possible or if you know you could say me which inheritance rule I have forgot? Thanks.
Hi Speculor,
read() method of FilterInputStream class calls read() method of InputStream, which is abstract... but it's assumed that InputStream passed with FilterInputStream constructor is not abstract.. it must be a subclass which provides an implementation of read method.
For example FileInputStream.... which (if you see implementation) has a read() method not abstract (but native obviously).
Diego
Diego ti rispondo in italiano perch?dovresti esserlo visto il nome e il cognome. Mi chiamo Matteo e ti ringrazio per la risposta che dovrebbe essere convincente. Ti chiedevo a questo punto se questo meccanismo ?standard e quindi dovrei rileggere con pi?attenzione i miei testi di riferimento oppure se ?qualcosa che sai per esperienza o per induzione logica, nel qual caso potresti essere pi?dettagliato in merito. Credi possa fare un piccolo programma di esempio dove tutto questo risulta facilmente implementabile e soprattutto riscontrabile?
Ciao Matteo.
Scusa se ti rispondo in ritardo... ma ero in pausa pranzo.
Chiedimi pure qualcosa di pi?specifico e se posso darti una mano ti rispondo.
Le classi astratte sono utilizzate per fornire un comportamento standard lasciando per?uno o pi?metodi non implementati... liberi per le necessit?implementative degli utilizzatori.
Nel caso specifico la classe InputStream ?una classe astratta che lascia non implementato il metodo read(). Tu nel tuo codice non utilizzerai mai questa classe come oggetto, ma nel caso specifico una sua sottoclasse che ha implementato il metodo read().
Se vai nelle api di InputStream vedrai che ci sono diverse sottoclassi che estendono InputStream. Guarda ad esempio il codice di ByteArrayInputStream: in questa classe il metodo read() non ?nativo ma restituisce un byte appartenente al suo array interno.
I metodi nativi (ad esempio il metodo read() della classe FileInputStream) non hanno implementazione java ma fanno invece riferimento a delle chiamate dirette al sistema operativo.
Per quanto riguarda la classe FilterInputStream di cui parlavi: essa nel suo costruttore riceve un InputStream. Questo significa che si deve passare nel costruttore non la classe InputStream (che ?astratta) ma una classe che la estende e che quindi non sia astratta. Il motivo per il quale FilterInputStream faccia riferimento a una classe di tipo InputStream al suo interno, ?che in java gli stream di input e di output possono essere composti l'uno sopra l'altro per formare una "catena" (a tal proposito vedi per maggiori dettagli uno dei tani articoli che si trovano in rete.... ad esempio ti indico questo http://java.sun.com/developer/technicalArticles/Streams/ProgIOStreams/). Comunque per dirla in due parole: tu puoi voler usare un FileInputStream per leggere un file, ma se hai bisogno di effettuare una lettura pi?efficiente (quindi bufferizzata) puoi aggiungere in catena al FileInputStream un oggetto di tipo FilterInputStream (nel caso specifico un BufferedInputStream che non ?altro che una sottoclasse di FilterInputStream).
Spero di aver chiarito qualche tuo dubbio!
Ciao
Diego
Ciao Diego.
Dopo aver letto con attenzione il tuo messaggio ho riconsiderato le classi del pacchetto java.io e ora la maggior parte delle cose mi sono piuttosto chiare: un errore grossolano che commettevo era quello di non considerare una variabile di superclasse come puntatore di una istanza di sottoclasse. Tra l'altro mi ero messo in testa che ogni concreta implementazione del metodo read() dovesse poggiare su un qualche metodo nativo, ma ad una pi?attenta analisi del problema ?abbastanza evidente che tale requisito sia necessario solo per quei flussi da disco (FileInputstream) e non per esempio per quelli che leggono da buffer di memoria o altro di simile. Non ho avuto ancora tempo sufficiente per tirare le fila di tutto questo e per capire profondamente la coerenza di questa struttura: nei prossimi giorni cercher?di svolgere questa analisi e probabilmente trover?alcuni dettagli che non mi convincono del tutto e sui quali potresti darmi dei preziosi ragguagli. Devi inoltre sapere che tutta questa analisi, compresa la necessit?di andare a scorrere il codice sorgente delle varie classi, ?cominciata perch?volevo capire in modo esaustivo la gestione delle eccezioni nelle operazioni di IO, gestione che sento dover essere piuttosto semplice ma che per qualche strano motivo faccio fatica a sintetizzare: soprattutto in merito a questo ultimo aspetto potresti essermi di aiuto. Quando riuscir?a formulare delle domanda veramente circostanziate, il pi?presto possibile, approfitter?della tua disponibilit?per un confronto per me molto prezioso. In attesa di questo ti saluto e ancora ti ringrazio.
Ha m醨 elt閞韙黱k a saj醫 nyelv黱kre egy nemzetk鰖i (aka English) f髍umot, akkor mi閞t is ne lehetne az a nyelv 閜pens間gel magyar?