在并发写入时使FileInputStream失败

时间:2014-05-22 02:46:03

标签: java file scala file-io

我有一个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打开时),那么我的应用程序只是认为文件已被完全读取并完成而没有错误。

如果在阅读时操作文件,我怎样才能使我的应用程序抛出异常?再说一遍:我想在阅读时允许更改文件。我只是希望我的应用程序注意到它可以重试。

1 个答案:

答案 0 :(得分:0)

1)如果仅附加文件,则以字节为单位跟踪它的长度 - 如果在读取之间更改,则必须有其他人

2)轮询time of last modification,如果有变化,则必须有其他人