Java — чтение из файла. Поток ввода и считыватель

В каждой реализации 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

Итак, почему люди используют считыватели вместо потоков?

Если у меня есть метод, который берет текстовый файл и возвращает строку, содержащую весь текст, обязательно ли лучше делать это с помощью потока?

14
задан Jeremy 22 April 2012 в 16:40
поделиться