Stoppare un BufferedInputStream

di il
2 risposte

Stoppare un BufferedInputStream

Ciao a tutti! Sto svolgendo un progetto per la scuola, e sto implementando un lettore .mp3! Come supporto utilizzo la libreria JLayer ( http://www.javazoom.net/javalayer/javalayer.htm )...La cosa che più mi mette in crisi è la PAUSA! Non ho idea di come procedere perchè non trovo un modo per dire "interrompi la lettura dello Stream, e poi ricomincia da li"...insomma non ho idee di come fare sinceramente...c'è un modo per ricominciare a leggere un BufferedInputStream non dall'inizio ma da dove ci si era, eventualmente, fermati !?! Grazie.

2 Risposte

  • Re: Stoppare un BufferedInputStream

    Un BufferedInputStream non e' un ogetto attivo, ma passivo, nel senso che lui non fa nulla, ma e' qualcun altro ad utilizzarlo. E' un particolare InputStream che legge da file invece che un byte alla volta, un blocco di byte (se non sbaglio di default 1024, ma comunque e' configurabile). Questo riduce notevolmente il tempo di lettura di un file.

    Comunque, lui non fa nulla di magico. Se qualcuno non lo usa, sta semplicemente li fermo.

    Non conosco la libreria, ma a naso dire che l'oggetto interessante e' il javazoom.jl.player.Player che possiede il metodo play, ma non un metodo pause.

    Ora, ci sono due modi per ottenere quello che vuoi tu, entrambi non semplici, ma nemmeno troppo difficili.

    Metodo 1) a mio avviso il piu' interessante: ti scarichi i sorgenti della libreria, studi come e' implementato il metodo play ed aggiungi un metodo pause (e sfrutti sempre il metodo play per continuare).

    Metodo 2) implementi un PausableBufferedInputStream (bleak che brutto nome )), che si comporta come un BufferedInputStream ma in piu' ha un paio di metodi pause e continue per mettere in pausa e continuare il play.

    Il metodo 2) e' decisamente piu' complesso se non conosci la programmazione multithreading ed il concetto di pipe. Concetti semplici da un certo punto di vista, ma che non e' possibile spiegare in un post: sono argomenti di interi libri! O almeno di interi capitoli nei libri di programmazione in Java. In linee generali quello che dovresti fare in questo caso e'

    a) derivare PausableBufferedInputStream da BufferedInputStream
    b) ridefinire i metodi read in modo non da leggere dal file ma da un buffer popolato da un'altro thread
    c) implementare un thread nel PBIS che legge da file e riempie il buffer
    d) implementare le regole di sincronizzazione produttore/consumatore sul buffer
    e) implementare un oggetto semaforo che il thread nel PBIS controlla ciclicamente
    f) implementare i metodi pause e continue che modificano il semaforo
    g) sul metodo pause il thread si sospende
    h) sul metodo continue il thread viene fatto ripartire.

    I concetti di programmazione concorrente li devi avere anche per il metodo 1).
    Ma dovrebbe essere piu' semplce implementare i punti e),f),g),h), avendo gia' a disposizione un'infrastruttura funzionante.

    Come vedi, non e' proprio immediato .
  • Re: Stoppare un BufferedInputStream

    Ciao! Grazie per la risposta! Avevo già risolto...diciamo che ho adottato un metodo simile al secondo che mi hai suggerito...praticamente ho creato la classe MyBufferedInputStream Che estende BufferedInputStream , ho fatto override dei metodi "read ( )" e "read(byte,len, off)", ho utilizzato il lock implicito di un oggetto di tipo Object creato come campo della classe,cosi facendo blocco la lettura del buffer nel metodo "read(byte,len, off)" che è utilizzato privatamente dal metodo "read ( )" acquisendo o rilasciando mediante un metodo il lock dell'oggetto...insomma ho risolto! Si comunque conosco la programmazione multithreading... Altrimenti nn potrei mai fare un lettore! xD
Devi accedere o registrarti per scrivere nel forum
2 risposte