Java 什么可以被fileInputStream.available()替换?

Java 什么可以被fileInputStream.available()替换?,java,java-io,Java,Java Io,在学习Java IO时,我发现fileInputStream有一个available()方法,它可以等于读取本地文件时的文件大小。因此,如果您可以直接知道文件的大小,那么在需要读取整个文件的情况下,是否有必要使用BufferedInputStream来装饰它? 像这样: FileInputStream FileInputStream=newfileinputstream(“F:\\test.txt”); 字节[]数据=新字节[fileInputStream.available()]; if(fi

在学习Java IO时,我发现
fileInputStream
有一个
available()
方法,它可以等于读取本地文件时的文件大小。因此,如果您可以直接知道文件的大小,那么在需要读取整个文件的情况下,是否有必要使用
BufferedInputStream
来装饰它? 像这样:

FileInputStream FileInputStream=newfileinputstream(“F:\\test.txt”);
字节[]数据=新字节[fileInputStream.available()];
if(fileInputStream.read(data)!=-1){
System.out.println(新字符串(数据));
}

BufferedReader BufferedReader=新的BufferedReader(新的
文件阅读器(“F:\\test.txt”);
StringBuilder StringBuilder=新的StringBuilder();
for(字符串行;(line=bufferedReader.readLine())!=null;){
stringBuilder.append(行);
}
System.out.println(stringBuilder.toString());

BufferedInputStream BufferedInputStream=new BufferedInputStream(new FileInputStream(“F:\\test.txt”);
字节[]数据=新字节[bufferedInputStream.available()];
如果(bufferedInputStream.read(数据)!=-1){
System.out.println(新字符串(数据));
}
这些方法的优缺点是什么?哪一个更好?
thx.

您对
available()
的含义理解错误。它返回在不阻塞的情况下可以读取的字节数。从文件:

注意,虽然InputStream的一些实现将返回流中的总字节数,但许多实现不会返回。使用此方法的返回值来分配用于保存此流中所有数据的缓冲区是不正确的

因此,如果要将流转换为字节数组,则应使用相应的库,例如:


在内存使用方面,缓冲将有所帮助,因为您不必首先将所有内容读入内存。也就是说,如果这三种方法都能奏效,我会选择你最熟悉的方法。但是,在所有3个代码段中都有一个主要流程:您没有提供有关文件编码的任何信息,因此将字节转换为字符的部分将使用系统的默认编码。这可能是一个偶然的正确答案,但问题在于:这是一个偶然的机会。如果它“在读取本地文件时等于文件大小”,这是一个意外,并且它将在您读取文件的一个字节时停止保持。它所做的只是告诉您当前可以在不阻塞的情况下从流中读取多少字节,这完全是另一回事。Javadoc中有一些特定的警告,禁止您像上面那样使用它。如果您需要的话,可以通过现有的方法获取任何文件的大小。但你很少这样做。您不应该尝试将整个文件加载到内存中。由于使用了available(),第一个文件不正确,如上所述。您使用流而不是读取器来读取字符。第二个是不正确的,因为它删除了您所读内容的所有行尾。第三个不正确,因为使用了available()。谷歌搜索“JavaIO教程”。它有正确的示例。第三个示例也不正确,因为您忽略了
read()
返回的读取计数。假设您告诉我们您实际想要做什么?简而言之,只有当您有大量的短读/写时,缓冲才有帮助。它只会增加大型读/写的开销。这不是魔法;)感谢@user207421版本。我编辑了一个时刻:available返回可能的(不是最大的)字节数,因为根据文档available,它返回的是可以读取(或跳过)的字节数的估计值。
byte[] out = IOUtils.toByteArray(stream);