Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 05-12-2007, 19: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, 20:33   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 20: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, 20:51   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 21: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, 21: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, 21:27   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 21: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, 22:06   #9
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 22: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, 22:23   #11
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2007, 17: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, 17:56   #13
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2007, 19: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


Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Ford: l'elettrico genera una perdita di ...
Ayaneo Next 2: la console portatile Wind...
Il WiFi può vederti senza telecam...
Linux sotto assedio: SSHStalker riporta ...
Stellantis: dopo il crollo di venerd&igr...
Combat Liquid 360 HUD: raffreddamento AI...
Tornano le EVO Sessions della Formula E:...
Moltbook, il social network per AI: i po...
Cina: eseguito il test della navicella M...
Mistral, il rivale europeo di OpenAI, in...
Libri piratati, allarme rosso: 722 milio...
Ayaneo svela quasi tutte le specifiche d...
Sony chiude definitivamente con i regist...
Renault Twingo E-Tech Electric sotto i 2...
Auto elettriche, il freddo non fa pi&ugr...
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: 00:12.


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