我想在scala脚本中将文件a.txt复制到newDir /.在java中,这可以通过为2个文件创建2个文件流,从a.txt读取缓冲区并将其写入新文件的FileOutputStream来完成.有没有更好的方法来实现这个scala?可能是scala.tools.nsc.io._中的内容.我四处搜寻但找不到多少.
Ala*_*Dea 37
出于性能原因,最好使用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 )
Run Code Online (Sandbox Code Playgroud)
要尝试这个,请创建一个名为test.txt的文件,其中包含以下内容:
Hello World
Run Code Online (Sandbox Code Playgroud)
创建test.txt后,从命令行运行以下命令:
scala copy.scala test.txt test-copy.txt
Run Code Online (Sandbox Code Playgroud)
验证test-copy.txt是否Hello World包含其内容.
Bri*_*new 33
为什么不特别使用Apache Commons IO和FileUtils.copyFile()?请注意,FileUtils有大量的方法来复制文件/目录等.
Mar*_*tin 21
Java 7现已推出,您还有另一种选择:java.nio.file.Files.copy.最简单的解决方案(Scalas更优越,import更容易).只要您提出from并且to是您的问题中的字符串:
import java.nio.file.StandardCopyOption.REPLACE_EXISTING
import java.nio.file.Files.copy
import java.nio.file.Paths.get
implicit def toPath (filename: String) = get(filename)
copy (from, to, REPLACE_EXISTING)
Run Code Online (Sandbox Code Playgroud)
当然你应该开始使用java.nio.file.Paths而不是字符串.
Rue*_*ler 10
如果你真的想自己做,而不是使用像commons-io这样的库,你可以在2.8版本中执行以下操作.创建一个帮助方法"使用".它将为您提供一种自动资源管理形式.
def use[T <: { def close(): Unit }](closable: T)(block: T => Unit) {
try {
block(closable)
}
finally {
closable.close()
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以定义一个这样的复制方法:
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 , _) }
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,缓冲区大小(此处:1024)可能需要一些调整.
雇用sbt.IO。这是纯粹的Scala中,它只能复制已更改的文件,具有有用的程序一样copyDirectory,delete,listFiles等。您可以按如下方式使用它:
import sbt._
IO.copyFile(file1, file2)
Run Code Online (Sandbox Code Playgroud)
请注意,您应该添加适当的依赖项:
libraryDependencies += "org.scala-sbt" % "io" % "0.13.0"
编辑:实际上这不是一个好方法,因为依赖项"org.scala-sbt" % "io" % "version" 是使用特定的 scala 版本编译的,现在您不能将它与 2.10.X scala 版本一起使用。但也许将来你可以在你的依赖项中添加双 %%"org.scala-sbt" %% "io" % "version"并且它会起作用......
| 归档时间: |
|
| 查看次数: |
19395 次 |
| 最近记录: |