在学习Java IO时,我发现fileInputStream
有一个availabl()
方法,它可以在读取本地文件时等于文件大小。那么如果你能直接知道文件的大小,那么在需要读取整个文件的情况下,有必要使用BufferedInputStream
来装饰它吗?像这样:
FileInputStream fileInputStream=new FileInputStream("F:\\test.txt");
byte[] data=new byte[fileInputStream.available()];
if (fileInputStream.read(data)!=-1) {
System.out.println(new String(data));
}
要么
BufferedReader bufferedReader=new BufferedReader(new
FileReader("F:\\test.txt"));
StringBuilder stringBuilder=new StringBuilder();
for (String line;(line=bufferedReader.readLine())!=null;){
stringBuilder.append(line);
}
System.out.println(stringBuilder.toString());
要么
BufferedInputStream bufferedInputStream=new BufferedInputStream(new FileInputStream("F:\\test.txt"));
byte[] data=new byte[bufferedInputStream.available()];
if (bufferedInputStream.read(data)!=-1) {
System.out.println(new String(data));
}
这些方法的优点和缺点是什么?哪一个更好?谢谢。
你对available()
的含义是错误的。它返回可以无阻塞地读取的可能字节数。来自文档:
请注意,虽然InputStream的某些实现将返回流中的总字节数,但许多实现不会。使用此方法的返回值来分配用于保存此流中所有数据的缓冲区绝对不正确。
因此,如果要将流转换为字节数组,则应使用相应的库,例如IOUtils:
byte[] out = IOUtils.toByteArray(stream);