用于复制文件的Scala脚本

kul*_*rni 25 scala copy file

我想在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 IOFileUtils.copyFile()?请注意,FileUtils有大量的方法来复制文件/目录等.

  • 贬低为什么?重新使用现有组件对我来说似乎很实用. (10认同)

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)可能需要一些调整.


paw*_*icz 5

雇用sbt.IO。这是纯粹的Scala中,它只能复制已更改的文件,具有有用的程序一样copyDirectorydeletelistFiles等。您可以按如下方式使用它:

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"并且它会起作用......