Чем можно заменить fileInputStream.available ()? - PullRequest
0 голосов
/ 18 марта 2019

При изучении 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 Ответ

2 голосов
/ 18 марта 2019

Вы ошибаетесь в значении available().Он возвращает возможное количество байтов, которые вы можете прочитать без блокировки. Из документации:

Обратите внимание, что хотя некоторые реализации InputStream будут возвращать общее количество байтов в потоке, многиене буду.Никогда не правильно использовать возвращаемое значение этого метода для выделения буфера, предназначенного для хранения всех данных в этом потоке.

Итак, если вы хотите преобразовать поток в байтовый массив, вы должны использовать соответствующие библиотеки,такие как IOUtils :

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