Ho un BufferedReader
(generato da new BufferedReader(new InputStreamReader(process.getInputStream()))
). Sono abbastanza nuovo al concetto di BufferedReader
ma, a mio avviso, ha tre stati:Come determinare lo stato esatto di BufferedReader?
- Una riga è in attesa di essere letta; chiamare
bufferedReader.readLine
restituirà immediatamente questa stringa. - Il flusso è aperto, ma non c'è nessuna riga in attesa di essere letta; chiamando
bufferedReader.readLine
si bloccherà il thread fino a quando una linea diventa disponibile. - Il flusso è chiuso; chiamando
bufferedReader.readLine
restituirà null.
Ora voglio determinare lo stato di BufferedReader
, in modo da poter determinare se posso leggerlo senza appendere la mia applicazione. Il processo sottostante (vedi sopra) è notoriamente inaffidabile e potrebbe quindi essersi bloccato; in questo caso, non voglio che la mia applicazione host si blocchi. Quindi sto implementando una specie di timeout. Ho provato a farlo prima con il threading ma è diventato orribilmente complicato.
La chiamata BufferedReader.ready()
non consente di distinguere tra i casi (2) e (3) sopra. In altre parole, se ready()
restituisce false, potrebbe essere che lo stream sia appena stato chiuso (in altre parole, il processo sottostante è stato chiuso in modo corretto) o potrebbe essersi verificato che il processo sottostante fosse bloccato.
Quindi la mia domanda è: come determinare quale di questi tre stati è il mio BufferedReader
senza chiamare effettivamente readLine
? Sfortunatamente non posso semplicemente chiamare readLine
per controllare questo, in quanto apre la mia app fino a un blocco.
Sto usando JDK versione 1.5.
A proposito, suppongo per il momento che il mio processo sottostante non possa pendere nel mezzo di una linea ... anche se potrebbe essere un'ipotesi errata, non è accaduto finora durante i test e ho avuto altri problemi !! – Kidburla
N.B. Attualmente sto cercando altre opzioni rispetto al threading. Il problema era che la mia app non funziona al momento (per una serie di motivi incluso readLine) e trovo che i thread sono molto difficili da eseguire il debug, specialmente se sono in timeout. – Kidburla