是否可以通过FileInputStream检查文件是否正在使用,并且该流尚未关闭?

时间:2013-11-27 09:03:42

标签: java testing

有一种方法可以读取文件并执行某些操作:

public void readFileAndDoSomething(File file) {
     InputStream inputStream = new FileInputStream(file);
     // a lot of complex code which reads the inputStream
     // and we don't know if the inputStream is closed or not
}

现在我想测试该方法,以确保是否关闭了使用该文件的任何输入流。

我的测试代码:

public void test() {
    File testFile = new File("my_test_file");
    readFileAndDoSomething(testFile);

    // is it possible to just check the file to make sure
    // if it is still used by some unclosed input streams?
}

请在test方法中查看我的评论,是否可以?

2 个答案:

答案 0 :(得分:1)

至少在LINUX中是可能的,但不是直接在Java中。

LINUX有一个名为lsof的实用程序,它可以判断给定文件是否在某个进程中处于打开状态。您可以使用Runtime.exec或ProcessBuilder调用此实用程序。

在Windows中,我不确定,但你不能尝试打开文件进行写作吗?如果仍然有人打开该文件,它应该不起作用。

答案 1 :(得分:1)

要使此版本可测试,您应该传递InputStream而不是File

这样你可以自己关闭InputStream,或者编写一个传递模拟InputStream的测试,并验证该方法是否已关闭它。

public void readStreamAndDoSomething(InputStream inputStream) {
    // a lot of complex code which reads the inputStream
    // and we don't know if the inputStream is closed or not
}

public void clientCode(File file) {
    InputStream inputStream = new FileInputStream(file);
    readStreamAndDoSomething(inputStream);
    inputStream.close();
}