Java:在不锁定文件的情况下打开和读取文件

我需要能够用Java模仿’tail -f’。 我正在尝试读取一个日志文件,因为它是由另一个进程写的,但是当我打开文件来读取它时,它会锁定文件而另一个进程无法再写入它。 任何帮助将不胜感激!

这是我目前使用的代码:

public void read(){ Scanner fp = null; try{ fp = new Scanner(new FileReader(this.filename)); fp.useDelimiter("\n"); }catch(java.io.FileNotFoundException e){ System.out.println("java.io.FileNotFoundException e"); } while(true){ if(fp.hasNext()){ this.parse(fp.next()); } } } 

由于文件截断和(中间)删除等特殊情况,重建尾部很棘手。 要在不锁定的情况下打开文件,请将StandardOpenOption.READ与新的Java文件API一起使用,如下所示:

 try (InputStream is = Files.newInputStream(path, StandardOpenOption.READ)) { InputStreamReader reader = new InputStreamReader(is, fileEncoding); BufferedReader lineReader = new BufferedReader(reader); // Process all lines. String line; while ((line = lineReader.readLine()) != null) { // Line content content is in variable line. } } 

为了尝试用Java创建尾部,请参阅:

  • 方法examineFile(…)在https://github.com/AugustusKling/yield/blob/master/src/main/java/yield/input/file/FileMonitor.java
  • 以上内容由https://github.com/AugustusKling/yield/blob/master/src/main/java/yield/input/file/FileInput.java用于创建尾部操作。 queue.feed(lineContent)传递行内容以供侦听器处理,并等于this.parse(…)

您可以从该代码中获取灵感,或者只是复制您需要的部分。 如果您发现任何我不知道的问题,请告诉我。

在这里查看FileChannel API。 要锁定文件,您可以在此处查看

除非您在打开时指定正确的共享标志,否则Windows会对文件使用强制锁定。 如果要打开一个繁忙的文件,需要Win32-API CreateFile一个带有共享标志的句柄FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE

这在JDK内部的几个地方用于打开文件以读取属性和内容,但据我所知,它不会导出/可用于Java类库级别。 所以你需要找到一个本地库来做到这一点。

我认为,作为一个快速的解决方法,您可以从命令"cmd /D/C type file.lck"读取process.getInputStream()