Scala ファイル関連の処理
[履歴] [最終更新] (2016/02/20 12:13:06)
最近の投稿
注目の記事

ファイル操作 (作成、移動、削除、探索)

java.nio.file._java.io.File を利用しています。

import java.nio.file.{Paths, Files}
import java.nio.file.StandardCopyOption.REPLACE_EXISTING
import java.io.{File => JFile} // リネームして区別しやすくする

object Main {
  def main(args: Array[String]): Unit = {

    // 新規ファイル作成
    val file = Paths.get("sample.txt")
    if(Files.notExists(file)) Files.createFile(file)

    // 新規ディレクトリ作成
    val dir = Paths.get("mydir")
    val dirp = Paths.get("mydir", "mysubdir")
    if(Files.notExists(dir)) Files.createDirectory(dir) // mkdir
    if(Files.notExists(dirp)) Files.createDirectories(dirp) // mkdir -p

    // ファイルサイズ
    println(Files.size(file)) //=> 0

    // ファイル移動
    Files.move(file, file, REPLACE_EXISTING) // 存在していれば上書き
    Files.move(file, dirp.resolve(file.getFileName), REPLACE_EXISTING) // ディレクトリ間の移動

    // ファイルコピー
    Files.copy(dirp.resolve(file.getFileName), file, REPLACE_EXISTING) // 存在していれば上書き

    // ディレクトリであるかの判別
    println(Files.isDirectory(dirp)) //=> true

    // 存在すれば削除
    Files.deleteIfExists(dirp.resolve(file.getFileName))
    Files.deleteIfExists(dirp) // 中身が空でないとエラー
    Files.deleteIfExists(dir) // 中身が空でないとエラー
    Files.deleteIfExists(file)

    // ディレクトリ内のファイルを探索
    def getListOfFiles(dir: String): List[JFile] = {
      val d = new JFile(dir)
      if (d.exists) {
        var files = d.listFiles.filter(_.isFile).toList
        d.listFiles.filter(_.isDirectory).foreach{ dir =>
          files = files ::: getListOfFiles(dir.getAbsolutePath)
        }
        files
      }
      else {
        List[JFile]()
      }
    }
    println(getListOfFiles("src")) //=> List(/path/to/src/main/scala/Main.scala, /path/to/src/test/scala/.keep)
  }
}

ファイルの読み込みと書き込み

ファイルからの読み込みについてはこちらに記載した通りです。書き込みの例を含めて改めて記載します。scala.io はファイル書き込み機能を提供していないため java.io を利用しています。

import scala.io.Source
import java.io.PrintWriter

object Main {
  def main(args: Array[String]): Unit = {

    // ファイルから読み込み
    val source = Source.fromFile("sample.txt", "UTF-8") // Shift_JIS, EUC-JP なども可
    source.getLines.foreach{ line =>
      println(line)
    }
    source.close()

    // URL 指定でインターネットから読み込み
    val source2 = Source.fromURL("http://www.example.com", "UTF-8")
    source2.getLines.foreach{ line =>
      println(line)
    }
    source2.close()

    // 書き込み
    val pw = new PrintWriter("output.txt")
    pw.write("Hello, world")
    pw.close
  }
}
関連ページ
    概要 Scala は JVM 上で動作するバイトコードにコンパイルできる言語です。JAVA よりも柔軟な記述ができます。事前にこちらからダウンロードおよびインストールしておいてください。基本的な文法をまとめます。 変数および定数 詳細は『Scala の型に関する知識』をご参照ください。 object HelloWorld { def main(args: Array[String]):