我有一个Java(必须兼容Java 6)应用程序作为后台服务运行。该应用程序从文件系统中读取文件(只读)。由于它是一项服务,我不想在阅读时锁定文件。尽管如此,如果有人在我阅读时写入文件,我希望我的应用程序失败。
这是我设置的一个小测试(实际用scala编写):首先我创建一个包含随机内容的10 MB文件:
$ dd if=/dev/urandom of=/tmp/random bs=1m count=10
然后是我的测试:
package de.choffmeister.iotest
import org.specs2.mutable._
import java.io._
import scala.language.reflectiveCalls
class IOSpec extends Specification {
"Application" should {
"run" in {
using(new FileInputStream("/tmp/random")) { fs =>
val buffer = new Array[Byte](1024)
var done = false
while (!done) {
println("Reading 1 kB")
val read = fs.read(buffer, 0, buffer.length)
if (read > 0) {
Thread.sleep(100)
} else done = true
}
ok
}
}
}
def using[A <: { def close(): Unit }, B](closable: A)(inner: A => B): B = {
try {
inner(closable)
} finally {
closable.close()
}
}
}
对于那些不熟悉Scala的人:它只是一个简单的循环,以1 KB的块从头到尾读取文件。在每次读取之间,都有一个睡眠,因此整个过程需要几秒钟。
现在,当我在读取时覆盖while(因此在我的FileInputStream打开时),那么我的应用程序只是认为文件已被完全读取并完成而没有错误。
如果在阅读时操作文件,我怎样才能使我的应用程序抛出异常?再说一遍:我想在阅读时允许更改文件。我只是希望我的应用程序注意到它可以重试。
答案 0 :(得分:0)
1)如果仅附加文件,则以字节为单位跟踪它的长度 - 如果在读取之间更改,则必须有其他人
2)轮询time of last modification,如果有变化,则必须有其他人