summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library/scala/io/Source.scala23
-rw-r--r--test/files/run/unittest_io.scala30
2 files changed, 51 insertions, 2 deletions
diff --git a/src/library/scala/io/Source.scala b/src/library/scala/io/Source.scala
index cef8fd25a8..ff72873f86 100644
--- a/src/library/scala/io/Source.scala
+++ b/src/library/scala/io/Source.scala
@@ -244,7 +244,7 @@ abstract class Source extends Iterator[Char] {
* @return the character string of the specified line.
* @throws scala.compat.Platform.IllegalArgumentException
*/
- def getLine(line: Int): String = {
+ def getLine(line: Int): String = { // faster than getLines.drop(line).next
val buf = new StringBuilder()
val it = reset
var i = 0
@@ -264,9 +264,28 @@ abstract class Source extends Iterator[Char] {
ch = it.next
}
val res = buf.toString()
- buf.setLength(0)
+ buf.setLength(0) // hopefully help collector to deallocate StringBuilder
res
}
+
+ /** returns an iterator who returns lines (including newline character).
+ * a line ends in \n.
+ */
+ def getLines: Iterator[String] = new Iterator[String] {
+ val buf = new StringBuilder
+ def next = {
+ var ch = iter.next
+ while(ch != '\n' && iter.hasNext) {
+ buf.append(ch)
+ ch = iter.next
+ }
+ buf.append(ch)
+ val res = buf.toString()
+ buf.setLength(0) // clean things up for next call of "next"
+ res
+ }
+ def hasNext = iter.hasNext
+ }
/** Returns <code>true</code> if this source has more characters.
*/
def hasNext = iter.hasNext
diff --git a/test/files/run/unittest_io.scala b/test/files/run/unittest_io.scala
new file mode 100644
index 0000000000..59b82ff57e
--- /dev/null
+++ b/test/files/run/unittest_io.scala
@@ -0,0 +1,30 @@
+object Test {
+
+ import scala.testing.SUnit._
+ import scala.io.Source
+
+ class ReadlinesTest extends TestCase("scala.io.Source method getLines") {
+
+ val src = Source.fromString("""
+This is a file
+it is split on several lines.
+
+isn't it?
+""")
+ assertEquals("wrong number of lines",src.getLines.toList.length,5) // five new lines in there
+ //for(val line <- src.getLines) {
+ // Console.print(line)
+ //}
+ }
+ def main(args:Array[String]) = {
+ val ts = new TestSuite(
+ new ReadlinesTest
+ )
+ val tr = new TestResult()
+ ts.run(tr)
+ for(val failure <- tr.failures) {
+ Console.println(failure)
+ }
+ }
+
+}