18.5. Klasa Source
Przykładem iteratora ze standardowej biblioteki języka Scala jest abstrakcyjna klasa Source z pakietu scala.io. Ta klasa roszerza typ Iterator[Char] i służy do reprezentowania różnych źródeł danych. Obiekt towarzyszący tej klasy posiada metody pozwalające tworzyć instancje klasy Source. Na przykład metoda fromString tworzy instancję tej klasy na podstawie łańcucha znaków.
scala> val source = scala.io.Source.fromString("hello")
source: scala.io.Source = non-empty iterator
scala> source.forEach(println)
h
e
l
l
o
Metody o nazwie fromFile (których jest kilka) tworzą instancje klasy Source reprezentujące dane z plików. Na przykład oba poniższe polecenia tworzą instancje tej klasy z danymi pochodzącymi z pliku greetings.txt. Drugie z poleceń specyfikuje kodowanie znaków, jakie ma być użyte przy odczycie danych.
scala> val g1 = scala.io.Source.fromFile("greetings.txt")
g1: scala.io.BufferedSource = non-empty iterator
scala> val g2 = scala.io.Source.fromFile(new java.io.File("greetings.txt"), "UTF-8")
g2: scala.io.BufferedSource = non-empty iterator
Zawartość pliku greetings.txt jest następująca.
Plik greetings.txt: Hello Hi Welcome
Poniższe polecenie tworzy łańcuch znaków z tych znaków z pliku, które są w zakresie od a do z.
scala> g1.filter(c => c >= 'a' && c <= 'z').mkString res1: String = elloielcome
Kolejny przykład wyświetla poszczególne znaki pliku, rozdzielając je spacjami.
scala> g2.foreach(c => print(" " + c))
H e l l o
H i
W e l c o m e
W poniższym przykładzie użyta jest metoda getLines, która zwraca iterator poszczególnych wierszy danych. Użyta jest także inna wersja metody fromFile.
scala> val lines=scala.io.Source.fromFile(new java.io.File("greetings.txt")).getLines
lines: Iterator[String] = non-empty iterator
scala> lines.mkString(",")
res3: String = Hello,Hi,Welcome
Plik greetings.txt:
Hello
Hi
Welcome
