Newsgroup: it.comp.java
Titolo: Lettura e scrittura byte su file strana

Ciao a tutti,
 sono nuovo del gruppo, e vi scrivo per un comportamento che non riesco a
spiegarmi nella lettura/scrittura file.
Sto usando un BufferedWriter/Reader per scrivere un file di caratteri
 alcuni caratteri li scrivo e rileggo e, come dovrebbe essere, sono ancora
li.
Altri, per esempio il carattere #137, lo scrivo ...ma rileggo un '?'
(#63)...
Questo per esempio:
try {
  BufferedWriter out=new BufferedWriter(new FileWriter("ciao"));
  out.write((short)137);
  out.flush();
  BufferedReader in=new BufferedReader(new FileReader("ciao"));
  System.out.println(in.read());
} catch (Exception e) {}
Non mi pare un problema di cast... Ne conoscete il motivo?
Grazie mille,
 a presto!
    Zen

 ha scritto nel messaggio
news:yHu4c.68463$FJ6.2...@twister1.libero.it...
| Altri, per esempio il carattere #137, lo scrivo ...ma rileggo un
| '?' (#63)...
E' un problema di codifica.
Poichè non hai indicato una codifica di caratteri,
la codifica predefinita è "Cp1252" che rappresenta
i caratteri con un range -128 -> 127.
Traine le conseguenze: 137 -> overflow.
Soluzione:
Assegna una codifica di più ampio range,
ad esempio "UTF-8".
In scrittura:
OutputStreamWriter osw =
  new OutputStreamWriter(
     new FileOutputStream("ciao"),
        Charset.forName("UTF-8"));
BufferedWriter out=new BufferedWriter(osw);
In lettura:
InputStreamReader isr =
   new InputStreamReader(
      new FileInputStream("ciao"),
         Charset.forName("UTF-8"));
BufferedReader in=new BufferedReader(isr);
Per verificare la codifica utilizzata:
System.out.println(osw.getEncoding());
Spero di aver esposto con chiarezza.
Cordiali saluti,
GianpieroP
-----BEGIN PGP SIGNATURE-----
Version: PGP 8.0
iQA/AwUBQFLrA54sPKh9SaicEQJ6FQCgvdQ9DmpXHV4dycfRGzzQEkaNp5YAoMqW
n2N+8YihN+PIroD9EAikI28p
=Heww
-----END PGP SIGNATURE-----

 ad esempio "UTF-8".
Grazie,
Ora provo con l'UTF-8...
A me in se non interessano i caratteri in se ma come numeri...
Usando cp1252 quindi io scrivo su file un byte ma i bit più significativi
non li considera?
A poi...

Aggiornamento, come dicevi tu, usando la codifica UTF-8
ha un comportamento ancora strano (ehm, per me naturalmente)
Mi scrive un file con 2byte...
io voglio semplicemente scrivere il numero 135 nei primi 8 bit del file
OutputStreamWriter out =
    new OutputStreamWriter(
    new FileOutputStream("ciao"),
    Charset.forName("UTF-8"));
out.write((char)135);
out.flush();

Grazie mille GianpieroP per l'indicazione, alla fine la strada era proprio
degli OutputStream che vanno usati per scrivere byte, ma senza l'indicazione
della codifica funzia a dovere
Ho risolto con:
BufferedOutputStream out=
 new BufferedOutputStream( new FileOutputStream("ciao") );
out.write((char)135);
out.flush();
BufferedInputStream in=new BufferedInputStream(
 new FileInputStream("ciao") );
System.out.println(in.read());
Ciao ciao,
    Zen

 ha scritto nel messaggio
news:0JC4c.68883$FJ6.2...@twister1.libero.it...
| Grazie mille GianpieroP per l'indicazione, alla fine la strada era
| proprio degli OutputStream che vanno usati per scrivere byte, ma
| senza l'indicazione della codifica funzia a dovere
Infatti.
Non avevo capito che volevi scrivere numeri.
BTW:
i Reader e i Writer lavorano sul testo.
i Data lavorano sui tipi predefiniti.
Ti consiglio quest'ultima categoria.
Ciao
GianpieroP.
-----BEGIN PGP SIGNATURE-----
Version: PGP 8.0
iQA/AwUBQFMIpp4sPKh9SaicEQKq/QCg9EHHKrIMrawrAlDA8FFs3Rejb28AoM01
2zKe4LX8+QDywk0NUsGbYXei
=FG4p
-----END PGP SIGNATURE-----