Java.io.File.length() 和 InputStream.available() 得出的值是一样的吗?在写文件的时候既要用InputStream流,又要知道File的length ,可不可以直接用流和流的available()?

解决方案 »

  1.   

    available总是比length小的,最多一样大。读取文件干嘛一定要知道它的length,除非你要做完整性校验,比如md5或者crc。
      

  2.   

    完全不一样!File#length 表示是文件的大小,与文件系统相关。
    而 InputSteam#available 表示是在输入流中读取数据直接阻塞时的大小。
      

  3.   

    同意。
    File length()返回的是一个固定的值,但是如果InputStream整在读取数据时,不同时刻的InputStream.available()值不尽相同
      

  4.   

    available就文件有用的部分,应该没有包括文件头吧,而length包括了文件头。
      

  5.   

    available()只是一个估计值
    返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。下一个调用可能是同一个线程,也可能是另一个线程。一次读取或跳过此估计数个字节不会受阻塞,但读取或跳过的字节数可能小于该数。
    length()返回文件的长度
    此抽象路径名表示的文件的长度,以字节为单位写文件时,随着文件的写入,文件的内容多了,长度也会变长。但,一般文件流都有一个缓冲,与available()估计下次操作是否阻塞有关。
      

  6.   

    api说明,你说一样不一样?length
    public long length()返回由此抽象路径名表示的文件的长度。如果此路径名表示一个目录,则返回值是不确定的。 返回:
    此抽象路径名表示的文件的长度,以字节为单位;如果文件不存在,则返回 0L。对于表示特定于系统的实体(比如设备或管道)的路径名,某些操作系统可能返回 0L。 
    抛出: 
    SecurityException - 如果存在安全管理器,且其 SecurityManager.checkRead(java.lang.String) 方法拒绝对文件进行读访问available
    public int available()
                  throws IOException返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。下一个调用可能是同一个线程,也可能是另一个线程。一次读取或跳过此估计数个字节不会受阻塞,但读取或跳过的字节数可能小于该数。 
    注意,有些 InputStream 的实现将返回流中的字节总数,但也有很多实现不会这样做。试图使用此方法的返回值分配缓冲区,以保存此流所有数据的做法是不正确的。 如果已经调用 close() 方法关闭了此输入流,那么此方法的子类实现可以选择抛出 IOException。 类 InputStream 的 available 方法总是返回 0。 此方法应该由子类重写。 
    返回:
    可以不受阻塞地从此输入流读取(或跳过)的估计字节数;如果到达输入流末尾,则返回 0。 
    抛出: 
    IOException - 如果发生 I/O 错误。