Leer una linea de archivo
Leer todas lineas desde un archivo, puede llamar al método getLine del Objeto scala.io.Source :
import scala.io.Source
val source = Source.fromFile("myfile.txt", "UTF-8")
// El primer argumento va ser un string or java.io.File
val lineIterator = source.getLines
El resultado es un iteraror que permite procesar las lineas:
for (l <- lineIterator) process l
o se puede volcar las lineas en un arreglo o en un buffer :
val lines = source.getLines.toArray
Algunas veces deseamos volcar el contenido de un archivo en un string, lo podemos hacer con :
val contents = source.mkString
Ojo! Cuando terminamos de usar source debemos cerrarlo.
Para leer caracteres podemos utilizar directamente source e iterar por le mismo:
for (c <- source) process c
Si deseamos leer un archivo (como istream :: peek en C ++ o PushbackInputStreamReader en Java), llama al método buffered en el origen
val source = Source.fromFile("myfile.txt", "UTF-8")
val iter = source.buffered
while (iter.hasNext) {
if (iter.head is nice)
process iter.next
else
…
}
source.close()
Veamos como podemos leer un todos lo espacios en nuestro código:
val tokens = source.mkString.split("\\s+")
Para convertir un String a entero o flotante se puede utilizar los métodos toInt o toDouble
Si necesitamos leer un entero desde la consola, podemos hacer lo siguiente:
print("Cuntos años tienes? ")
val age = readInt()
// O podemos usar readDouble o readLong
Este comando asume que el usuario ingresará un numero y si no lo hace se lanzara NumberFormatException
Leer url o otros recursos.
Para leer desde una Url o algun otro recurso podemos utilizar Source de la siguiente manera:
val source1 = Source.fromURL("http://horstmann.com", "UTF-8")
val source2 = Source.fromString("Hello, World!")
// lee desde un string, puede ser util para cuando se esta debugeando
val source3 = Source.stdin
// lee desde la entrada estandar
Leer archivos Binarios.
Para leer archivos binarios debemos utilizar la librería estándar de java. Veamos como podemos leer un archivo binario a un array de bytes:
val file = new File(filename)
val in = new FileInputStream(file)
val bytes = new Array[Byte](file.length.toInt)
in.read(bytes)
in.close()
Escribir un archivo de texto.
Scala no tiene un objeto o función especial para escribir archivos, debemos utilizar la librería de java. Por ejemplo:
val out = new PrintWriter("numbers.txt")
for (i <- 1 to 100) out.println(i)
out.close()
Todo funciona como se esperaba, excepto para el método printf. Cuando pasa un número a printf, el compilador se quejará de que necesita convertirlo a un AnyRef:
out.printf("%6d %10.2f",
quantity.asInstanceOf[AnyRef], price.asInstanceOf[AnyRef])
pero podemos usar el método de formato de la clase String:
out.print("%6d %10.2f".format(quantity, price))