我想在Java中设置一个阻止文件读取的操作。也就是说,当使用FileInputStream
并调用任何read()
方法时,调用会被阻塞。
我无法想到一个简单的与操作系统无关的方式 - 在类Unix的操作系统中,我可以尝试使用mkfifo
创建一个FIFO并从该文件中读取。一个可能的解决方法是只需创建一个非常大的文件并从其中读取 - 在捕获堆栈之前读取不太可能完成,但它很丑陋且速度较慢(实际上,当缓存时读取仍然可以非常快)。
相应套接字read()
情况很容易设置 - 自己创建套接字并从中读取,您可以具有确定性阻止。
目的是检查方法的堆栈以确定这种情况下的顶部框架是什么。想象一下,我有一个组件,定期采样所有正在运行的线程的堆栈跟踪,然后尝试分类线程此刻正在做什么。它可能正在进行文件IO。因此,我需要知道在文件IO期间“堆栈顶部”的外观是什么。我已经通过实验确定了这一点(只是以各种方式读取文件并采样堆栈),但我希望编写一个测试,如果有任何更改,该测试将失败。
编写此类测试的自然方式是启动执行文件读取的线程,然后检查顶部框架。要可靠地执行此操作,我需要进行阻塞读取(否则线程可能在捕获堆栈跟踪之前完成其读取等)。
FileInputStream.getChannel()
并不断重置光标不起作用,因为它会改变一段时间的堆栈跟踪。如果你认为可能行得通,我可以在答案中详细说明。同样地,我猜扩展FileInputStream也行不通,因为如果我理解正确,你正试图“指纹识别”FileInputStream.read*方法。 - J Richard SnapeFIS
,但问题是我无法从执行读取的线程中获取转储。根据定义,当_native_read0
方法(或任何其他方法)位于堆栈顶部时,我没有控制权,也无法转储该线程。我当然可以在之前完成它,但这确实使我得到了正确的顶部帧或两个。 - BeeOnRope