愿FileInputStream.available愚蠢吗?

Tom*_*ito 6 java file-io

这个FileInputStream.available()javadoc说:

返回可以从此输入流中读取(或跳过)的剩余字节数的估计值,而不会被下一次调用此输入流的方法阻塞.下一次调用可能是同一个线程或另一个线程.单个读取或跳过这么多字节不会阻塞,但可以读取或跳过更少的字节.

在某些情况下,非阻塞读取(或跳过)可能在其速度很慢时似乎被阻止,例如在通过慢速网络读取大型文件时.

我不确定在这张支票中是否:

if (new FileInputStream(xmlFile).available() == 0)
Run Code Online (Sandbox Code Playgroud)

我可以依赖那些空文件总是返回零吗?

-

谢谢@SB,他没有完全回答这个问题,但却是第一个给出最佳选择的人:

如果xmlFile是java.io.File对象,则可以使用length()方法获取其大小.

Ste*_*n C 4

如果指定的文件为空,您可以依赖返回零。new FileInputStream(fileName).available()

不能依赖new FileInputStream(fileName).available() == 0该文件为空作为最终测试。如果fileName是本地文件系统上的常规文件,它可能会起作用。但如果fileName是设备文件或者远程文件系统上的文件,则available()可能会返回零以报告 aread()将必须阻塞一段时间。(或者在远程文件系统的情况下,可能不会。)

测试常规文件长度的更可靠方法是使用new File(fileName).length() == 0. 然而,对于设备文件或管道,length()无论最终可以读取的字节数是多少,调用都可能返回零。请记住,new File(fileName).length()如果文件不存在,也会返回零。

编辑如果您想要进行可靠的测试来查看文件是否为空,则必须进行多次调用:

public static isEmptyFile(String fileName) {
    File file = new File(fileName);
    if (!file.exists()) {
        return false;
    } else if (file.length() != 0L) {
        return false;
    } else if (file.isFile()) {
        return true;
    } else if (file.isDirectory()) {
        return false;
    } else {
        // It may be impossible to tell that a device file / named pipe is
        // "empty" without actually reading it.  This is not a failing of
        // Java: it is a logical consequence of the way that certain
        // devices, etc work.
        throw new CannotAnswerException(...);
    }
}        
Run Code Online (Sandbox Code Playgroud)

但强烈建议您在运行应用程序的所有平台上使用各种“文件”类型仔细测试这一点。某些文件谓词的行为被记录为特定于平台;请参阅javadoc