当我试图注册一个文件而不是一个目录java.nio.file.NotDirectoryException被抛出.我可以监听单个文件更改,而不是整个目录吗?
其他人的过程是通过在事件发生时一次添加一行来创建CSV文件.我无法控制文件格式或其他进程,但我知道它只会附加.
在Java程序中,我想监视这个文件,当附加一行时,读取新行并根据内容做出反应.暂时忽略CSV解析问题.监视文件以进行更改并一次读取一行的最佳方法是什么?
理想情况下,这将使用标准库类.该文件可能在网络驱动器上,所以我想要一些强大的失败.如果可能的话,我宁愿不使用轮询 - 我更喜欢某种阻塞解决方案.
编辑 - 鉴于标准类无法实现阻塞解决方案(感谢您的回答),最强大的轮询解决方案是什么?我不想每次都重新读取整个文件,因为它可能会变得非常大.
我想知道是否有一种简单的方法可以在Groovy中拖尾文件?我知道如何读取文件,但如何读取文件,然后等待添加更多行,读取,等待等等...
我有一个我确定是一个非常愚蠢的解决方案:
def lNum = 0
def num= 0
def numLines = 0
def myFile = new File("foo.txt")
def origNumLines = myFile.eachLine { num++ }
def precIndex = origNumLines
while (true) {
num = 0
lNum = 0
numLines = myFile.eachLine { num++ }
if (numLines > origNumLines) {
myFile.eachLine({ line ->
if (lNum > precIndex) {
println line
}
lNum++
})
}
precIndex = numLines
Thread.sleep(5000)
}
Run Code Online (Sandbox Code Playgroud)
请注意,我对调用Unix"tail"命令并不感兴趣.除非它是唯一的解决方案.
我有一个文件夹,其中不断传输新文件.在Java中,检测文件系统中更改的最佳方法是什么(即,文件被转储的指定文件夹),并将新到达的文件添加到队列数据结构,以便我可以顺序处理每个传入的文件.
我知道File类中的listFiles()函数,但是使用它我只能获得瞬间可用的文件.当然,我可以继续轮询文件夹并使用线程获取其中的文件列表.但这是最好的方法还是有更好的方法来实现这一点.
我有很多配置文件可以修改我的应用程序的行为方式.我希望能够进行更改,并在保存文件时立即反映在应用程序中.有没有Java库来帮助解决这个问题?
我可以简单地保存一个带有时间戳的文件列表,并在时间戳发生变化时不断检查后台线程.似乎并不太难,但也许有更有效的方法来做到这一点?某些属性更改后的自定义触发器会很好.
我使用的是Spring 3.1,是否有内置的机制或解决方案可以很好地与Spring配合使用?
更新:显然JDK7现在通过其 Watch Service API包含此功能:"大多数文件系统实现都具有对文件更改通知的本机支持.Watch Service API利用此支持(如果可用).但是,当文件系统不支持此机制时,Watch Service将轮询文件系统,等待事件." 所以这是我迁移到JDK7的动力.
这是一个非常糟糕的问题(在我看来),我尽力找到自己有用的文档,运气不好 - 无论如何,这里是:
我有代码需要对目录中的所有文件执行某些操作.我在File对象中设置目录,并使用fileObject.list()迭代目录中的文件.我让这段代码在一夜之间运行,并且(经过多次骚动)在某些时候崩溃了.我想弄清楚这发生了什么事(是的,我记录得很糟糕).现在,根据这个javadoc,在列出文件时无法保证订单(按字母顺序或其他方式),我想知道是否有任何一致性保证?这意味着当我运行相同的代码两次时,我会得到完全相同的文件顺序吗?逻辑告诉我它应该并且我已经恢复了基于此的操作,但我对此持怀疑态度.此外,我很好奇javadoc中"没有具体的订单意味着什么".
我有一个程序监视日志文件的更改.该程序使用FileInputStream来继续读取文件.同时,日志文件可能会被轮换:重命名旧日志文件,并将新日志条目写入新文件.
我的程序如何确定文件是否重命名,以便切换到新日志文件的读取?
我能够将Jnotify听力事件用作文件编辑,修改等.我关注的是Jnotify的工作原理.我的意思是它使用get事件.在资源使用的参考中使用是否安全.我读了另一个问题 - /sf/ask/777000241/ - 它消耗了大量资源.
我可以解决我的问题的另一种方法是while循环直到条件然后程序关闭.
哪个更好用,消耗更少的资源.