Omet navegació

3.3 - Conversors: InputStreamReader i OutputStreamWriter

Una vegada vistes les jerarquies de les classes InputStream-OutputStream per una banda, i Reader-Writer per una altra, veurem ara unes classes que serviran per a passar d'una jeraquia a una altra. És a dir, poder passar un InputStream a Reader, o el que és el mateix, un flux orientat a bytes en un flux orientat a caràcters. I el mateix amb el OutputStream i el Writer.

  • InputStreamReader: passa un InputStream a Reader. Accepta com a paràmetre el InputStream i dóna com a resultat un Reader.
  • OutputStreamWriter: passa un OutputStream a Writer. Accepta com a paràmetre el OutputStream i dóna com a resultat un Writer.

A més en el constructor dels dos, InputStreamReaderOutputStreamWriter, tenim la possibilitat d'especificar el tipus de codificació, a més del InputStream o OutputStream. Açò ens serà molt útil, perquè fins el moment no podíem triar el tipus de codificació d'un FileReader o FileWriter que era UTF-8 en el cas de Linux, i ASCII (millor dit la seua extensió ISO-8859-1) en el cas de Windows. 

Mirem aquest exemple, en el qual transformem el mateix fitxer d'una configuració a una altra. Aprofitem algun dels fitxers que ja disposem (per exemple f5.txt, que tenia caràcters especials com vocals accentuades). En l'exemple el tindrem en codificació UTF-8, ja que està provat en Linux. El transformarem a ISO-8859-1. Copieu el següent codi en un fitxer anomenat Exemple_2_61.kt :

package exemples

import java.io.InputStreamReader
import java.io.FileInputStream
import java.io.OutputStreamWriter
import java.io.FileOutputStream

fun main(args: Array<String>) {
	val f_ent = InputStreamReader(FileInputStream("f5.txt"), "UTF-8")
	val f_eix = OutputStreamWriter(FileOutputStream("f5_ISO.txt"), "ISO-8859-1")

	var car = f_ent.read()
	while (car != -1) {
		f_eix.write(car)
		car = f_ent.read()
	}
	f_eix.close()
	f_ent.close()
}

Hem posat l'entrada explícitament que siga de UTF-8. En realitat no faria falta, ja que si treballem en Linux, aquesta serà la codificació per defecte, i per tant seria la que utilitzaria un FileReader.

 

FileReader f_ent = new FileReader("f5.txt")

Anem a fer una altra versió del mateix programa. A banda de no especificar la codificació del fitxer d'entrada, utilitzarem els decoradors BufferedReader i PrintWriter per a poder anar còmodament línia a línia. Copieu el següent codi en un fitxer anomenat Exemple_2_62.kt :

package exemples

import java.io.FileReader
import java.io.BufferedReader
import java.io.FileOutputStream
import java.io.OutputStreamWriter
import java.io.PrintWriter

fun main(args: Array<String>) {
	val f_ent = BufferedReader(FileReader ("f5.txt"))
	val f_eix = PrintWriter(OutputStreamWriter(FileOutputStream ("f5_ISO.txt"), "ISO-8859-1"))

	var cad = f_ent.readLine()
	while (cad != null) {
		f_eix.println(cad)
		cad = f_ent.readLine()
	}
	f_eix.close()
	f_ent.close()
}