Potrebbe esserci un errore nel JDK in BufferedOutputStream?

瀏覽次數:15 次
跳到第一則未讀訊息

Marco Scarpa

未讀,
2021年2月11日 中午12:41:062021/2/11
收件者: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

未讀,
2021年2月11日 下午2:05:242021/2/11
收件者: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

未讀,
2021年2月15日 清晨5:51:262021/2/15
收件者: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

未讀,
2021年2月15日 上午9:47:192021/2/15
收件者: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

未讀,
2021年2月15日 上午10:23:082021/2/15
收件者: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
回覆所有人
回覆作者
轉寄
0 則新訊息