FileInputStream.available可能会使我愚蠢吗?
这个FileInputStream.available()javadoc说:
返回可以从此输入流读取(或跳过)而不会被该输入流的方法的下一次调用阻塞的剩余字节数的估计值。下一个调用可能是同一线程或另一个线程。仅读取或跳过此多个字节不会阻塞,但可能会读取或跳过较少的字节。
在某些情况下,非阻塞读取(或跳过)可能仅在速度较慢时(例如,在速度较慢的网络上读取大文件时)就被阻塞。
我不确定是否在此检查中:
if (new FileInputStream(xmlFile).available() == 0)
我可以依靠空文件始终返回零吗?
-
感谢@SB,他没有完全回答问题,但是第一个提出最佳选择的人:
如果xmlFile是一个java.io.File对象,则可以使用length()方法获取其大小。
回答:
你 可以 依靠new FileInputStream(fileName).available()
,如果指定的文件是空回零。
您 不能 依赖new FileInputStream(fileName).available() ==
0该文件为空的确定测试。如果fileName
是本地文件系统上的常规文件,则可能会起作用。但是,如果fileName
是设备文件,或者如果它是远程文件系统上的文件,则available()
可能返回零以报告a
read()
必须阻塞一段时间。(或者如果是远程文件系统,则可能不是。)
测试常规文件长度的一种更可靠的方法是使用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(...);
}
}
但是,建议您在运行应用程序的所有平台上使用多种“文件”类型对此进行仔细测试。一些文件谓词的行为被记录为特定于平台的;参见javadoc。
以上是 FileInputStream.available可能会使我愚蠢吗? 的全部内容, 来源链接: utcz.com/qa/414698.html