用fileInputStream.available()可以代替什么?

时间:2019-03-18 09:01:57

标签: java java-io

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

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

1 个答案:

答案 0 :(得分:2)

您对available()的含义有误。它返回您可以无阻塞地读取的可能字节数。从文档中获取:

  

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

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

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