В каждой реализации Java, которую я вижу для чтения из файла, я почти всегда вижу средство чтения файлов, используемое для чтения построчно. Я думал, что это будет ужасно неэффективно, потому что для каждой строки требуется системный вызов.
Вместо этого я использовал входной поток и извлекал байты напрямую. В моих экспериментах это значительно быстрее. Моим тестом был файл размером 1 МБ.
//Stream method
try {
Long startTime = new Date().getTime();
InputStream is = new FileInputStream("test");
byte[] b = new byte[is.available()];
is.read(b);
String text = new String(b);
//System.out.println(text);
Long endTime = new Date().getTime();
System.out.println("Text length: " + text.length() + ", Total time: " + (endTime - startTime));
}
catch (Exception e) {
e.printStackTrace();
}
//Reader method
try {
Long startTime = new Date().getTime();
BufferedReader br = new BufferedReader(new FileReader("test"));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line);
sb.append("\n");
}
String text = sb.toString();
Long endTime = new Date().getTime();
System.out.println("Text length: " + text.length() + ", Total time: " + (endTime - startTime));
}
catch (Exception e) {
e.printStackTrace();
}
Это дает результат:
Text length: 1054631, Total time: 9
Text length: 1034099, Total time: 22
Итак, почему люди используют считыватели вместо потоков?
Если у меня есть метод, который берет текстовый файл и возвращает строку, содержащую весь текст, обязательно ли лучше делать это с помощью потока?