私は次の方法を持っています(実際には関数)
def addToJar(jarOut: JarOutputStream, file: File, reldir: String): Unit =
{
val fName = reldir + file.getName
val fNameMod = if (file.isDirectory) fName + "/" else fName
val entry = new JarEntry(fNameMod)
entry.setTime(file.lastModified)
jarOut.putNextEntry(entry)
if (file.isDirectory)
{
jarOut.closeEntry
file.listFiles.foreach(i => addToJar(jarOut, i, fName + "/"))
}
else
{
var buf = new Array[Byte](1024)
val in = new FileInputStream(file)
Stream.continually(in.read(buf)).takeWhile(_ != -1).foreach(jarOut.write(buf, 0, _))
in.close
jarOut.closeEntry()
}
}
他の質問やブログ投稿を見てこれを書きましたが、次の質問が残っています。
try-catch ブロックが必要ですか?
java.io.fileinputstream の代わりに Scala.io クラスを使用することは可能ですか?
java.nio.channels.FileChannel や Apache Commons IO の FileUtils.copyFile や Java 7 の Files.copy を使うよりもバッファ書き込み方式の方が速いというのは正しいでしょうか?
大規模なプロジェクトの場合、jar 作成ユーティリティ全体を C++ で記述し、それを 1 回呼び出すだけで、大きなパフォーマンスが得られるでしょうか?
注: Scala 2.11 の最後の開発マイルストーンを書いている時点では、M6 はリリースされていません。ただし、私の理解では、Scala.io への追加はありません。