Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 05-12-2007, 18:24   #1
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
[JAVA] problemino con ByteArrayOutputStream

Salve, devo inviare su un socket una Stringa convertita in array di byte. Per convertire la stringa uso

Codice:
byte[] buffer = "pippoplutopaperinopaperogaeziopaperone".getBytes();
dopodichè devo inviare questo buffer su un OutputStream di un socket. Non lo devo inviare tutto subito, ma 10 byte la volta. Mi hanno consigliato di usare ByteArrayOutputStream ma non ho capito come... mi date una mano?
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 19:33   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da redcloud Guarda i messaggi
Codice:
byte[] buffer = "pippoplutopaperinopaperogaeziopaperone".getBytes();
Sì, tecnicamente corretto. Però vorrei precisare una cosa. Quando si parla di conversione da String a sequenza di byte (o viceversa) è necessario tenere sempre in considerazione il "charset" usato per codificare la sequenza di byte.

Ora ... getBytes() fornisce una sequenza di byte codificata secondo il charset di "default" della piattaforma (quale sia, dipende....). Visto che devi inviare la sequenza su socket, immagino ad un altro host, c'è da prestare attenzione ad una cosa: chi riceve la sequenza sa esattamente quale charset è stato usato per la codifica??

Quote:
Originariamente inviato da redcloud Guarda i messaggi
dopodichè devo inviare questo buffer su un OutputStream di un socket. Non lo devo inviare tutto subito, ma 10 byte la volta. Mi hanno consigliato di usare ByteArrayOutputStream ma non ho capito come... mi date una mano?
No, semmai è proprio la classe diametralmente opposta, cioè ByteArrayInputStream. Un ByteArrayInputStream lo si costruisce passando un array di byte e poi tramite i metodi read() si può leggere un tot di byte per volta (nel tuo caso, come hai detto, 10), che poi scriverai sul socket.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 19:42   #3
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Quote:
Originariamente inviato da andbin Guarda i messaggi
Sì, tecnicamente corretto. Però vorrei precisare una cosa. Quando si parla di conversione da String a sequenza di byte (o viceversa) è necessario tenere sempre in considerazione il "charset" usato per codificare la sequenza di byte.

Ora ... getBytes() fornisce una sequenza di byte codificata secondo il charset di "default" della piattaforma (quale sia, dipende....). Visto che devi inviare la sequenza su socket, immagino ad un altro host, c'è da prestare attenzione ad una cosa: chi riceve la sequenza sa esattamente quale charset è stato usato per la codifica??
Si ho tralasciato il discorso del charset perchè chi riceverà saprà come interpretare i byte.

Quote:
Originariamente inviato da andbin Guarda i messaggi
No, semmai è proprio la classe diametralmente opposta, cioè ByteArrayInputStream. Un ByteArrayInputStream lo si costruisce passando un array di byte e poi tramite i metodi read() si può leggere un tot di byte per volta (nel tuo caso, come hai detto, 10), che poi scriverai sul socket.
Ah e come li scrivo sul socket? Mi fai un esempio spiccio? Ti ringrazio molto.
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 19:51   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da redcloud Guarda i messaggi
Ah e come li scrivo sul socket? Mi fai un esempio spiccio? Ti ringrazio molto.
Semplificando e ignorando, per brevità, eccezioni ecc....:

Codice:
ByteArrayInputStream bais = new ByteArrayInputStream (arrBytes);
byte[] buf = new byte[10];
int len;

while ((len = bais.read (buf)) > 0)
    os.write (buf, 0, len);
Per 'os' intendo in generale un OutputStream associato al socket ... poi non so esattamente cosa userai.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 20:18   #5
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Quote:
Originariamente inviato da andbin Guarda i messaggi
Semplificando e ignorando, per brevità, eccezioni ecc....:

Codice:
ByteArrayInputStream bais = new ByteArrayInputStream (arrBytes);
byte[] buf = new byte[10];
int len;

while ((len = bais.read (buf)) > 0)
    os.write (buf, 0, len);
Per 'os' intendo in generale un OutputStream associato al socket ... poi non so esattamente cosa userai.
arrBytes è il byte[] che mi da getBytes()?

Quindi in pratica sto cavolo di bytearray è come se fosse un array con iteratore annesso: una figata! Ma esiste anche per altri tipi diversi da byte, chessò, StringArray, IntegerArray, o non ha senso?

Quindi fin quando read riesce a riempire il buf, len sarà sempre uguale alla lunghezza di buf (cioè 10)?

Grazie parecchio!
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 20:19   #6
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Un'altra cosa. Se lo stream collegato al socket è di tipo DataOutputStream va bene lo stesso?
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 20:27   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da redcloud Guarda i messaggi
arrBytes è il byte[] che mi da getBytes()?
Esatto.

Quote:
Originariamente inviato da redcloud Guarda i messaggi
Quindi in pratica sto cavolo di bytearray è come se fosse un array con iteratore annesso: una figata! Ma esiste anche per altri tipi diversi da byte, chessò, StringArray, IntegerArray, o non ha senso?
Ci sono CharArrayReader/CharArrayWriter che fanno una cosa concettualmente uguale.
Nel package java.nio ci sono classi per gestire dei Buffer più particolari (e differenti dagli stream), che si usano tipicamente con i "channel".

Quote:
Originariamente inviato da redcloud Guarda i messaggi
Quindi fin quando read riesce a riempire il buf, len sarà sempre uguale alla lunghezza di buf (cioè 10)?
Salvo l'ultimo blocco che potrebbe essere < 10. Quando non ci sono più byte, la read() ritorna -1, quindi il ciclo termina, per come ho posto la condizione.

Quote:
Originariamente inviato da redcloud Guarda i messaggi
Grazie parecchio!
Please.

Quote:
Originariamente inviato da redcloud Guarda i messaggi
Un'altra cosa. Se lo stream collegato al socket è di tipo DataOutputStream va bene lo stesso?
Si va benissimo perché è-un OutputStream. Io infatti non potevo sapere se usavi un DataOutputStream o un ObjectOutputStream!
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 20:55   #8
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Quote:
Originariamente inviato da andbin Guarda i messaggi
Si va benissimo perché è-un OutputStream. Io infatti non potevo sapere se usavi un DataOutputStream o un ObjectOutputStream!
Grazie. I casini me li ha creati un po' l'ereditarietà tra ArrayByteOutputStream, DataOutputStream e OutputStream. I primi infatti estendono OutputStream ma sono proprio due cose diverse tra loro e non riuscivo a capire come poter trasformare un ArrayByteOutputStream in uno stream direttamente collegabile a uno stream preso da socket. In questi casi come si fa? Si deve solo leggere attentamente la documentazione?
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 21:06   #9
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da redcloud Guarda i messaggi
Grazie. I casini me li ha creati un po' l'ereditarietà tra ArrayByteOutputStream, DataOutputStream e OutputStream. I primi infatti estendono OutputStream ma sono proprio due cose diverse tra loro e non riuscivo a capire come poter trasformare un ArrayByteOutputStream in uno stream direttamente collegabile a uno stream preso da socket. In questi casi come si fa? Si deve solo leggere attentamente la documentazione?
Le varie classi che hai detto sono semplicemente a livelli di "astrazione" differenti. OutputStream è una classe astratta ed è la "base" di tutte le altre. DataOutputStream/ObjectOutputStream se vai a vedere nella documentazione, possono essere create passando appunto un OutputStream (che in genere è di livello più "basso" come un FileOutputStream o quello di un socket).

Ma nel tuo caso non serviva certo ArrayByteOutputStream, perché non devi creare l'array ma, avendolo già, leggerlo a pezzetti. Tra l'altro, volendo essere pignoli, si potrebbe fare anche senza usare ByteArrayInputStream. Avendo l'array di byte, ti bastava scrivere i blocchi di 10 byte ragionando sugli offset: da offset 0 len 10, da offset 10 len 10, ecc....
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 21:12   #10
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Quote:
Originariamente inviato da andbin Guarda i messaggi
Ma nel tuo caso non serviva certo ArrayByteOutputStream, perché non devi creare l'array ma, avendolo già, leggerlo a pezzetti. Tra l'altro, volendo essere pignoli, si potrebbe fare anche senza usare ByteArrayInputStream. Avendo l'array di byte, ti bastava scrivere i blocchi di 10 byte ragionando sugli offset: da offset 0 len 10, da offset 10 len 10, ecc....
Lo so, era proprio per evitare il lavoraccio che forse mi hanno consigliato di usare quella classe, visto che è lei che si occupa di leggere tot byte volta per volta senza preoccuparsi degli offset, visto che anche tu in 2 righe hai risolto il problema...

Grazie.
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 21:23   #11
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da redcloud Guarda i messaggi
visto che anche tu in 2 righe hai risolto il problema...
Sì, in effetti con ByteArrayInputStream la soluzione è lineare e "pulita", anche se c'è chiaramente un leggero overhead (la creazione del ByteArrayInputStream, la creazione del buf, la lettura con copia nel buf).

Volendolo fare senza ByteArrayInputStream comunque non è proprio un lavoraccio:
Codice:
byte[] dati = ......
int off = 0;
int len = 10;

while (off < dati.length)
{
    len = Math.min (dati.length - off, len);
    os.write (dati, off, len);
    off += len;
}
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2007, 16:05   #12
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Scusami, una cosa ancora...

mi capita che l'ultimo ciclo di lettura legga meno caratteri della dimensione del buffer e quindi ottengo un buffer con dati sporchi nella parte finale. Come posso ottenere l'ultimo buffer di dimensione effettiva dei byte rimanenti? (scusa l'ingarbugliamento)
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2007, 16:56   #13
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da redcloud Guarda i messaggi
mi capita che l'ultimo ciclo di lettura legga meno caratteri della dimensione del buffer e quindi ottengo un buffer con dati sporchi nella parte finale. Come posso ottenere l'ultimo buffer di dimensione effettiva dei byte rimanenti? (scusa l'ingarbugliamento)
Stai usando la soluzione con ByteArrayInputStream?? L'esempio di codice che ho postato all'inizio mi sembra(va) chiaro: quando leggo con la read(), devo tenere in considerazione il suo valore di ritorno (il numero di byte letti) perché lo devo usare nella write. Se l'ultimo blocco è lungo 6 e non 10, entrerò ancora nel ciclo (essendo > 0) e la write la farò di 6 byte.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2007, 18:56   #14
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Hai ragione, sbagliavo io a usare l'offset. Grazie!

Ho un altro quesito da porti:

Codice:
InputStream in = socket.getInputStream();

while(in.read() >= 0)
    System.out.println("DENTRO");

System.out.println("FUORI");
Perchè una volta inviati tutti i dati sul socket, FUORI non viene mai stampato? La read mi sembra di aver capito che è bloccante ma quando ritorna -1? Io scrivo sul socket semplicemente un byte[]...
redcloud è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Slackbot genera dashboard e microsite de...
Idrogeno, nuova cella a combustibile rag...
Con la NASA fuori dai giochi, l'ESA risc...
Una falla di ChatGPT permette di estrapo...
Piano clima, 1,34 miliardi per il bonus ...
Porsche esce definitvamente da Bugatti R...
NVIDIA App aggiunge una delle funzioni p...
Come sarebbe il mondo se la luce viaggia...
Titanio, ceramica e zaffiro per HUAWEI W...
Taglio delle accise sul gasolio prorogat...
Universal e ElevenLabs: una piattaforma ...
Astra mette in crisi i server di OpenAI:...
Phanteks EX5: disponibile il case a bloc...
Broadcom rimuove l'accesso a uno strumen...
Italo porta Starlink sui treni ad Alta V...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:44.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v