scala play中的文件副本

时间:2013-10-02 06:10:24

标签: scala playframework

我要在scala中复制文件但是得到FileNotFound错误,assets文件夹在src的同一目录中:

val src = new File("/assets/public/images/default/male.jpg")
val dest = new File("/assets/public/images/profile/male1.jpg")

new FileOutputStream(dest) getChannel() transferFrom(
new FileInputStream(src) getChannel, 0, Long.MaxValue )

3 个答案:

答案 0 :(得分:2)

在您的代码中,您尝试使用FileOutputStream复制文件,这需要现有文件的有效路径,否则它将抛出FileNotFoundException。 (参见文档here

val src = new File("/assets/public/images/default/male.jpg")
val dest = new File("/assets/public/images/profile/male1.jpg")
new FileOutputStream(dest) //dest should exist

尽管如此,Play还有自己的实用程序来复制文件。这是link

import play.api.libs.Files
Files.copyFile(src, dest, true, true)
println(dest.getAbsolutePath())  // filepath of copied file

此外,由于文件被复制到工作目录,您可能无法在您喜欢的IDE的文件夹结构中看到新文件。

除此之外,您可以使用routes

获取公共资产的路径
val srcPath = routes.Assets.at("public/images/default/male.jpg").url

答案 1 :(得分:0)

一般建议

在Java上复制文件时,请使用Apache commons项目中的FileUtils.copy(...)

针对您的具体问题

如果正在运行的进程找不到该文件,则会出现“找不到文件”。这可能是因为您的文件确实不存在,或者因为该进程缺少查看文件的权限。

答案 2 :(得分:0)

您的措辞有点含糊不清,似乎您打算提供相对于当前工作目录的路径。这意味着应该从包含assets目录的目录执行此代码。如果是这样,那么你犯了一个错误并给出了文件对象的绝对路径,而不是相对的路径。您所要做的就是从这些路径中删除初始正斜杠,它应该可以工作。

实际上,您告诉Scala / Java查看assets的根目录。