|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
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(); |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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?? 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%) |
|
|
|
|
|
|
#3 | ||
|
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
Quote:
Quote:
|
||
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
ByteArrayInputStream bais = new ByteArrayInputStream (arrBytes);
byte[] buf = new byte[10];
int len;
while ((len = bais.read (buf)) > 0)
os.write (buf, 0, len);
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#5 | |
|
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
Quote:
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! |
|
|
|
|
|
|
#6 |
|
Bannato
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?
|
|
|
|
|
|
#7 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Esatto.
Quote:
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:
Please. 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%) |
||
|
|
|
|
|
#8 |
|
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
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?
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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%) |
|
|
|
|
|
|
#10 | |
|
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
Quote:
Grazie. |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
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%) |
|
|
|
|
|
#12 |
|
Bannato
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) |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#14 |
|
Bannato
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");
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:04.




















