Чтение файла
Чтение файлов осуществляется классом scala.io.Source, при помощи которого можно получить поток данных из файла, как то поток строк или поток символов.
Source.fromFile(“data.txt”) – вернет scala.io.BufferedSource экземпляр не пустого итератора.
Source.fromFile(“data.txt”).mkString – вернет все содержимое файла как единую строку.
Source.fromFile(“data.txt”).getLines.foreach { x => println(x) }; – вернет итератор со строками файла (построчная обработка).
Запись в файл
Запись производится через классы java
1 2 3 4 5 6 7 8 9 10 11 |
// PrintWriter import java.io._ val pw = new PrintWriter(new File("hello.txt" )) pw.write("Hello, world") pw.close // FileWriter val file = new File(canonicalFilename) val bw = new BufferedWriter(new FileWriter(file)) bw.write(text) bw.close() |
Обычно FileWriter используется для записи простого текста в файл, однако есть некоторые различия между PrintWriter и FileWriter. Например, хотя оба класса наследуются от Writer, и оба могут использоваться для записи простого текста в файлы, FileWriter выбрасывает IOExceptions, тогда как PrintWriter не генерирует исключений и вместо этого устанавливает флаги Boolean, которые можно проверить. Кроме того PrintWriter позволяет установить кодировку для записываемого текста. Обратите внимание, что конструкторы PrintWriter позволяют указать кодировку, но FileWriter такого поведения не имеет. В Java 8 FileWriter Javadoc предлагает использовать OutputStreamWriter для FileOutputStream для указания кодировки файла.
Работа с бинарными данными
1 2 3 4 |
val byteArray: Array[Byte] = Array(1,2) val bos = new BufferedOutputStream(new FileOutputStream(filename)) bos.write(byteArray) bos.close() |
1 2 3 4 5 6 |
val bytes = new Array[Byte](1024) //1024 bytes - Buffer size Stream .continually (input.read(bytes)) .takeWhile (-1 !=) .foreach (read=>output.write(bytes,0,read)) output.close() |
Пример использования классических Java классов для бинарной работы с файлами, для задачи копирования файла
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import java.io._ object CopyBytes extends App { var in = None: Option[FileInputStream] var out = None: Option[FileOutputStream] try { in = Some(new FileInputStream("/tmp/Test.class")) out = Some(new FileOutputStream("/tmp/Test.class.copy")) var c = 0 while ({c = in.get.read; c != −1}) { out.get.write(c) } } catch { case e: IOException => e.printStackTrace } finally { println("entered finally ...") if (in.isDefined) in.get.close if (out.isDefined) out.get.close } } |