2010-05-07 85 views
4

这FileInputStream.available()的Javadoc说:可能FileInputStream.available愚蠢的我?

返回从该输入流 可以读取(或 跳过) 剩余字节数的估计值,而不受下一个 调用的阻断一个用于此输入的方法 流。下一个调用可能是 相同的线程或另一个线程。 A 单个读取或跳过这个很多字节 不会被阻塞,但可能会读取或跳过 较少的字节。

在一些情况下,一个非阻塞读取(或 跳过)可能会被阻塞时,它 仅仅是缓慢的,例如,当读取 大文件通过慢速 网络。

我不知道,如果在此检查:

if (new FileInputStream(xmlFile).available() == 0) 

可我靠的是空文件将始终返回零?

-

感谢@SB,谁不正好回答了这个问题,但第一次给的最佳替代品:

如果XMLFILE是java.io.File的对象, 你可以使用length()方法获得它的大小 。

回答

2

可以依靠new FileInputStream(fileName).available()如果指定文件为空则返回零。

不能依靠new FileInputStream(fileName).available() == 0作为一个明确的测试,该文件是空的。如果fileName是本地文件系统上的常规文件,它可能会工作。但是,如果fileName是设备文件,或者如果它是远程文件系统上的文件,则available()可能返回零来报告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

+0

所以我不能依靠length()?没有可靠的测试? – 2010-05-07 20:17:47

2

我强烈建议不要使用available() - 它可以返回0,因为流被阻塞,即使仍然有足够的字节要读取。它可能不会出现在文件中,但API不保证它不会。

同样的方法可以用read()方法,虽然可以使用:

if (new FileInputStream(xmlFile).read() == -1) 
    System.out.println("!!File empty!!"); 
2

如果XMLFILE是java.io.File的对象,你可以使用length()方法来获取它的大小。

+0

@SB - 但是,在零长度文件以外的情况下,File.length()将返回零;看到j​​avadoc。 – 2010-05-08 00:27:51

+0

斯蒂芬 - 好点,但我认为这是比使用可用的更好的选择。如果文件是目录或不存在,可用的功能有哪些?我的猜测是它返回0,但它也可以返回0如果大小大于0. – 2010-05-08 22:59:06

2

我对这个问题的逻辑回答是“我可以依靠空文件总是返回零吗?”是“是的,对于空文件,available()将返回0”。

但是你可能也想知道“我可以依靠的是只有空文件将返回零?”,和那里的答案是“不,不规范:available()可能,即使该文件是不返回0空”。

此外,您正在打开一个文件流并且不要再关闭它。这可能导致意想不到的行为,例如,只要Java程序正在运行,您可能无法移动或删除文件。如果您的程序在通常运行很长时间的应用程序服务器中运行,这使得文件有效地不可变,这特别令人讨厌。