Potrebbe esserci un errore nel JDK in BufferedOutputStream?

15 views
Skip to first unread message

Marco Scarpa

unread,
Feb 11, 2021, 12:41:06 PM2/11/21
to JUG Padova
Ciao, 

Finché leggevo il codice di BufferedOutputStream (un po' perché non lo uso assiduamente e volevo capirne di più) mi sono imbattuto nel codice del metodo write:

public synchronized void write(int b) throws IOException {
                   if (count >= buf.length) {
                         flushBuffer();
                    }
                 buf[count++] = (byte)b;
}

Passi la scelta di usare un intero per scrivere un byte, ho risalito la gerarchia delle classi ed è proprio così, il metodo per come è definito ignora il resto e tiene solo l'ultimo byte.

Non è sbagliato? nella prima parte non c'è nulla che vada a cambiare il valore di count per cui non sarà mai più grande del buffer mentre l'incremento viene fatto dopo in fase di scrittura e se count superasse  il limite del buffer andrebbe in out of bounds, il codice è preso aprendo la classe BufferedOutputStream con intelliJ nel JDK 8

Raffaele Dell'Aversana

unread,
Feb 11, 2021, 2:05:24 PM2/11/21
to jugp...@googlegroups.com
Ciao,
La flushBuffer azzera il count. E guardare il codice di sera fa brutti scherzi... :-) 


--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "JUG Padova" di Google Gruppi.
Per annullare l'iscrizione a questo gruppo e non ricevere più le sue email, invia un'email a jugpadova+...@googlegroups.com.
Per visualizzare questa discussione sul Web, visita https://groups.google.com/d/msgid/jugpadova/965ab143-e20b-4511-98f5-d0f3c105f2a5n%40googlegroups.com.

Marco Scarpa

unread,
Feb 15, 2021, 5:51:26 AM2/15/21
to JUG Padova
lo so, ma il fatto è che non viene lanciata se count non è maggiore o uguale a buf.length e questa situazione non mi risulta che accada mai in quel metodo ed essendo tutti synchronized non mi risulta ci siano metodi di altri thread che potrebbero portare a questa situazione (guadrando il resto del codice); secondo me avrebbero prima dovuto incrementare count, fare la verifica e poi in caso il flush

Lucio Benfante

unread,
Feb 15, 2021, 9:47:19 AM2/15/21
to jugp...@googlegroups.com

Scusate, senza accorgemene avevo risposto a Marco solo privatamente. Reinoltro alla lista l'ultimo scambio di messaggi.

Lucio



-------- Messaggio Inoltrato --------
Oggetto: Re: [jugpadova] Potrebbe esserci un errore nel JDK in BufferedOutputStream?
Data: Mon, 15 Feb 2021 15:19:42 +0100
Mittente: Marco Scarpa <qwert...@gmail.com>
A: Lucio Benfante <lucio.b...@jugpadova.it>


ok, adesso ci sono, scusate ma in effetti mi sembrava un po' strano un errore in una classe così usata.

Provo un attimo a riepilogare.
  • si fa un buffer con capacità 2 e l'intento è inserire 3 byte
  • inserendo il primo byte
    • prima di invocare count vale 0
    • 0 < della capacità dell'array, non fa il flush
    • l'indice usato dall'array è 0
    • count diventa 1 subito dopo inserito perché c'è il post incremento

  • inserendo il secondo byte
    • prima di invocare count vale 1
    • l'indice usato dall'array è 1
    • 1 < della capacità dell'array, non fa il flush  
    • count diventa 2 subito dopo inserito perché c'è il post incremento

  • inserendo il terzo byte
    • prima di invocare count vale 2
    • 2 >= alla capacità del buffer che è 2
    • scatta il flush
    • l'indice usato dall'array è 0
    • count diventa 1 subito dopo inserito perché c'è il post incremento

Grazie per la cortese attenzione

Marco Scarpa

Cellulare +39 340 500 49 91
Skype qwertyscar
Yahoo qwertyscar2003


Il giorno lun 15 feb 2021 alle ore 12:29 Lucio Benfante <lucio.b...@jugpadova.it> ha scritto:

Ciao.

No, il count conta appunto il numero di byte scritti nel buffer fino a quel momento.

Quindi, se una precedente scrittura ha riempito il buffer, viene controllato ed eventualmente svuotato, prima di eseguirne un'altra.

Lucio

Il 15/02/21 11:51, Marco Scarpa ha scritto:

Raffaele Dell'Aversana

unread,
Feb 15, 2021, 10:23:08 AM2/15/21
to jugp...@googlegroups.com

Ok avevo capito male il tuo commento ma lo stesso non mi pare scritto male il codice.

Se non passa da if vuol dire che count<buf.length, quindi buf[count] non va in out of bounds (alla peggio count==buf.length-1). Alla write successiva fa il flushBuffer.


Il 15/02/21 11:51, Marco Scarpa ha scritto:
lo so, ma il fatto è che non viene lanciata se count non è maggiore o uguale a buf.length e questa situazione non mi risulta che accada mai in quel metodo ed essendo tutti synchronized non mi risulta ci siano metodi di altri thread che potrebbero portare a questa situazione (guadrando il resto del codice); secondo me avrebbero prima dovuto incrementare count, fare la verifica e poi in caso il flush
Reply all
Reply to author
Forward
0 new messages