Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
HONOR Magic V6 è arrivato in Italia a 2.299,90 euro con una promessa precisa: unire 4 mm di spessore da aperto (8,75 mm chiuso nel modello White, 9 mm negli altri colori) a una batteria da 6.660 mAh, la più capiente mai vista su un pieghevole. Lo abbiamo usato per oltre una settimana in versione Red 16/512 GB per capire se lo Snapdragon 8 Elite Gen 5 tiene testa alla concorrenza anche fuori dai benchmark ufficiali
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7 punta su un display ampio e fluido, una batteria capace di accompagnare l'uso quotidiano senza ansie da ricarica e un prezzo accessibile, a partire da 179,90 euro per la versione con 64 GB di storage. Lo Snapdragon 6s 4G Gen 2 e i 4 GB di RAM della configurazione più diffusa frenano però chi cerca reattività e multitasking spinto: ecco il bilancio dopo due settimane di prova diretta
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
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


Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere? Recensione HONOR Magic V6: spessore record e sup...
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni Redmi Pad 2 9.7: ampio display, economico e peso...
Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Xiaomi Air Fryer Essential 6L: ha tutto ...
Apple riduce la produzione di iPhone 17:...
Lancio del razzo spaziale cinese Lunga M...
SpaceX Starship: Super Heavy Booster 20 ...
Questa RTX 3070 è tornata in vita...
Un ricercatore scopre uno script bash na...
Robot umanoidi teleoperati eseguono le p...
QuadRF, il gadget da 499 dollari che leg...
ChatGPT, Claude e Gemini nel mirino: cos...
Pneumatici dalla Cina, l'UE introduce da...
SpaceX vuole 100.000 satelliti in orbita...
Disney+ gratis, ma con pubblicità: l'ult...
Microsoft ammette: emissioni di CO2 su d...
Apple denuncia OpenAI e due ex dirigenti...
Asha Sharma licenzia migliaia di dipende...
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: 07:10.


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