【问题标题】:Check if a file is open before reading it?在读取文件之前检查文件是否打开?
【发布时间】:2013-03-12 02:00:31
【问题描述】:

我正在尝试制作一个小程序,它以非常频繁的间隔(每秒几次)读取本地文件系统(用户计算机)上的文件,然后通过以下方式将文件的内容提供给网页javascript。

小程序需要读取的文件由用户计算机上的程序以高频率更新。我担心的是如果小程序在文件正在更新时从文件中读取数据会发生什么。

我不知道这种可能性有多大,但如果这是一个有效的问题,有没有办法在读取文件之前确保文件当前没有被写入?

【问题讨论】:

  • 我的感觉是,除非您不保存文件,否则磁盘将拥有较旧的副本,并且会读取该较旧的文件。
  • @SuKu - 用户计算机上运行的程序会以高频率覆盖文件的内容。这是我的担心。我想知道小程序是否会在文件被覆盖时读取文件。
  • 您可以读取该文件,前提是您没有收到文件已在使用中的异常,并且如果您在某些读取中获得了较旧的内容,则不会有任何问题。
  • 文件是否有文本或数据? (ASCII、unicode、二进制)?
  • 一定要用Java吗?由于安全问题,一些用户可能在浏览器中禁用了 Java。

标签: java applet


【解决方案1】:

我对此并不肯定,但您可以尝试java.io.FileInputStream,或该软件包中的其他选项。

另外,这个问题可能是重复的。这可能会回答您的问题:

  1. How do I use Java to read from a file that is actively being written?
  2. reading a file while it's being written
  3. Read a file while it's being written
  4. Reading data from a File while it is being written to

【讨论】:

    【解决方案2】:

    进行这样的磁盘访问是非常可怕的,如果可以的话,请尝试使用套接字,或者如果您再次坐下来,如果其中一个锁定失败,请尝试在两端锁定文件,然后确保另一个正在锁定,弥补这个给你用

    File file = new File(fileName);
    FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
    // Get an exclusive lock on the whole file
    FileLock lock = channel.lock();
    try {
        lock = channel.tryLock();
        // Ok. You get the lock
    } catch (OverlappingFileLockException e) {
        // File is open by other end 
    } finally {
        lock.release();
    }
    

    【讨论】:

      猜你喜欢
      • 2012-07-02
      • 2015-04-19
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多