Я хочу скопировать файл a.txt в newDir/из scala сценария. В Java это было бы сделано путем создания 2 потоков файла для этих 2 файлов, чтения в буфер из a.txt и записи этого в FileOutputStream нового файла. Существует ли лучший способ достигнуть этого в scala? Может быть что-то в scala.tools.nsc.io._. Я искал вокруг, но не мог найти много.
Почему бы не использовать, в частности, Apache Commons IO и FileUtils.copyFile () ? Обратите внимание, что FileUtils имеет большое количество методов для копирования файлов / каталогов и т. Д.
Если вас не слишком волнует скорость, вы можете немного облегчить себе жизнь, читая файл с помощью 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 ест новые строки, поэтому их нужно добавлять обратно в запись.
Используйте System.Diagnostics.Stopwatch
Да, необходимо закрыть подключение. В противном случае клиент базы данных обычно сохраняет соединение сокета и другие ресурсы открытыми.
-121--714825-Если вы не хотите использовать что-либо внешнее, просто сделайте это так, как вы сделали бы это на Java. Самое приятное, что ты можешь.
Scalax имеет scalax.io.FileExtras.copyTo (dest: Файл). Но развитие вроде бы остановилось.
Если вы действительно хотите сделать это самостоятельно, а не использовать такую библиотеку, как 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) может потребовать некоторой настройки.
По причинам производительности лучше использовать 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
в качестве своего содержимого.