Сценарий Scala для копирования файлов

Я хочу скопировать файл a.txt в newDir/из scala сценария. В Java это было бы сделано путем создания 2 потоков файла для этих 2 файлов, чтения в буфер из a.txt и записи этого в FileOutputStream нового файла. Существует ли лучший способ достигнуть этого в scala? Может быть что-то в scala.tools.nsc.io._. Я искал вокруг, но не мог найти много.

25
задан kulkarni 8 February 2010 в 22:02
поделиться

6 ответов

Почему бы не использовать, в частности, Apache Commons IO и FileUtils.copyFile () ? Обратите внимание, что FileUtils имеет большое количество методов для копирования файлов / каталогов и т. Д.

33
ответ дан 28 November 2019 в 17:39
поделиться

Если вас не слишком волнует скорость, вы можете немного облегчить себе жизнь, читая файл с помощью scala.io.Source (эта реализация для 2.7.7):

def copyF(from: java.io.File, to: String) {
  val out = new java.io.BufferedWriter( new java.io.FileWriter(to) );
  io.Source.fromFile(from).getLines.foreach(s => out.write(s,0,s.length));
  out.close()
}

Но Source идет на все проблемы с разбором файла построчно, а затем вы просто записываете его снова, не обрабатывает строки на самом деле. Использование байтового чтения/записи Java-стиля будет значительно быстрее (примерно в 2-3 раза при последнем тестировании).


Правка: 2.8 ест новые строки, поэтому их нужно добавлять обратно в запись.

2
ответ дан 28 November 2019 в 17:39
поделиться

Используйте System.Diagnostics.Stopwatch

-121--3445732-

Да, необходимо закрыть подключение. В противном случае клиент базы данных обычно сохраняет соединение сокета и другие ресурсы открытыми.

-121--714825-

Если вы не хотите использовать что-либо внешнее, просто сделайте это так, как вы сделали бы это на Java. Самое приятное, что ты можешь.

1
ответ дан 28 November 2019 в 17:39
поделиться

Scalax имеет scalax.io.FileExtras.copyTo (dest: Файл). Но развитие вроде бы остановилось.

0
ответ дан 28 November 2019 в 17:39
поделиться

Если вы действительно хотите сделать это самостоятельно, а не использовать такую ​​библиотеку, как commons-io, вы можете сделать следующее в версии 2.8. Создайте вспомогательный метод "use". Это даст вам форму автоматического управления ресурсами.

def use[T <: { def close(): Unit }](closable: T)(block: T => Unit) {
  try {
    block(closable)
  }
  finally {
    closable.close()
  }
}

Затем вы можете определить метод копирования следующим образом:

import java.io._

@throws(classOf[IOException])
def copy(from: String, to: String) {
  use(new FileInputStream(from)) { in =>
    use(new FileOutputStream(to)) { out =>
      val buffer = new Array[Byte](1024)
      Iterator.continually(in.read(buffer))
          .takeWhile(_ != -1)
          .foreach { out.write(buffer, 0 , _) }
    }
  }
}

Обратите внимание, что размер буфера (здесь: 1024) может потребовать некоторой настройки.

10
ответ дан 28 November 2019 в 17:39
поделиться

По причинам производительности лучше использовать java.nio.Channel для выполнения копирования.

Листинг copy.scala:

import java.io.{File,FileInputStream,FileOutputStream}
val src = new File(args(0))
val dest = new File(args(1))
new FileOutputStream(dest) getChannel() transferFrom(
    new FileInputStream(src) getChannel, 0, Long.MaxValue )

Чтобы опробовать это, создайте файл test.txt со следующим содержимым:

Hello World

После создания test.txt выполните следующее из командной строки:

scala copy.scala test.txt test-copy.txt

Убедитесь, что test-copy.txt имеет Hello World в качестве своего содержимого.

37
ответ дан 28 November 2019 в 17:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: