首页 > 解决方案 > fileInputStream.available() 可以代替什么?

问题描述

在学习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));
      }

这些方法的优缺点是什么?哪一个更好?谢谢。

标签: javajava-io

解决方案


你对 的含义有误available()它返回您可以在不阻塞的情况下读取的可能字节数。从文档:

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

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

byte[] out = IOUtils.toByteArray(stream);

推荐阅读