Jade Dungeon

IO

终端

读取

用户输入:

val str = Console.readLine

readLine方法还可以加上一个参数作为给用户的提示:

val str = Console.readLine("Your name: ")

对于其他类型的,还有readIntreadDoublereadBytereadShortreadLongreadFloatreadBooleanreadChar

写入

printf("%6d %10.2f", quantity, price)

文本文件

写入

import java.io._

val writer = new PrintWriter(new File("tmp.txt"))
writer write "test"
writer.close()

读取

每个字符

import scala.io.Source

Source.fromFile("tmp.txt").foreach { print }

foreach()每次读一个字符(输入有缓冲,不用担心性能)。

迭代行

getLine(index)可以取得指定行,是索引,从0开始。

getLines()取得行的迭代器。然后用for循环、toArray等方法处理。

整个文件一起读

source.mkString把整个文件作为一个字符串。

二进制文件

读取

Scala没有提供,用Java类库:

val file = new File(filename)
val in = new FileInputStream(file)
val bytes = new Array[Byte](file.length.toInt)
in.read(bytes)
in.close()

目录访问

之前有FileDirectory,现在已经不用了,但还是可以在scala-compiler.jar文件 的scala.tools.nsc.io包中找到。

递归遍历目录下的子目录

import java.io.File

def subdirs(dir: File): Iterator[File] = {
	val children = dir.listFiles.filter(_.isDirectory)
	children.toIterator ++ children.toIterator.flatMap(subdirs _)
}

调用时只要:

for (d <- subdirs(dir)) {
	// 处理 d 
}

如果是用Java 7中java.nio.file.Files类的walkFileTree方法(FileVisitor)接口 。可以更加方便地用隐式转换:

import java.nio.file._

implicit def makeFileVisitor(f: (Path) => Unit) = new SimpleFileVisitor(Path) {
	override def visitFile(p: Path, attrs: attribute.BasicFileAttributes) = {
		f(p)
		FileVisitResult.CONTINUE
	}
}

调用(以打印为例子):

Files.walkFileTree(dir.toPath, (f: Path) => println(f))

读取URL

import scala.io.Source
import java.net.URL

val source = Source.fromURL(new URL("http://ifconfig.me/ip"))
source.getLines().foreach{ println }