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