Провожу тесты, что бы лучше понять потоки, считывания с файла и запись. Столкнулся с проблемой, сейчас введу в курс дела. Говорят, что использование буфера значительно ускоряет программу. Я написал код, что бы это проверить. Код считывает "большой" файл и заносит в массивы (файл с текстом на 90кб). Выводит на экран сколько времени это заняло. Тест 1: работа с потоком байтов
FileInputStream(путь)
Тест 2: работа с потоком через буфер
BufferedInputStream( new FileInputStream(путь))
Тест 3: поток байтов обворачиваем в буферный поток и переводим в символы
InputStreamReader(new BufferedInputStream(FileInputStream(путь)))
Тест 4: Считывание через буффер и перевод в буффер строк (Буфер строк <- Символы <- БуферБайтов <- Байты <- Файл)
BufferedReader br = new BufferedReader(new InputStreamReader(new BufferedInputStream(new FileInputStream(path))))
И если посмотреть на результаты - вот они. Если НЕ заносить в массив: На этом скрине в массив данные НЕ заносятся, массивы пустые. Просто считывание. Вопрос 1 - Почему текст №3 занимает меньше времени? Не понятно.. он же кроме того, что с помощью буфера считывает байты, еще и переводит их в символы... и при этом все равно делает это быстрее, нежели просто считывание байтов без перевода в символы (тест №2). А тест №4 вообще какой-то быстрый по сравнению с другими... чем больше строчек код - тем быстрее работает! Но это не главный вопрос. А главный в том, если заносить данные сразу в массивы. Вот что выходит (не обращайте внимания на ошибки): Что тут видно.. ситуация кардинально меняется. Если раньше просто байтовые поток были супер долгими, а символьные - быстрые, тут с точностью да наоборот. Но начнем с байтовых: Тест_1 - по идеи по 1у элементу должно заносить ощутимо дольше, нежели буфер (Тест_2), что заносит сначала все в свой буфер и потом записывает куда-то там еще (а начальный буфер у него - 8кб). Но порой результаты были для них - 0 / 0, т.е. одинаково мгновенно... Врут те, кто говорит, что буфер лучше? Или в чем дело? updated: увеличил размер файла до 2мб.. первый результат 3 / 2, второй 2 / 2, третий 4 / 3. Символьные... просто перевод в символы работает быстрее (5мс), нежели буферны (11мс). На самом деле на этом я окончательно запутался... почему такая разница в результатах? Потому что в тест №4 используется ArrayList? Так я же его не вывожу. А что с самым первым скрином, где при НЕ записывании в массив - скорость чтения ОЧЕНЬ долгая... подскажите если знаете. Код:
private static byte[] first;        // это для побайтового
private static byte[] second;       // это для буферного
private static char[] third;        // это для символьного
private static ArrayList<String> forth;

public static void main(String[] args) throws IOException {
    String path = ".../MyFileText_BigOne.txt";  // путь к файлу
    System.out.println("Тест №1. Считаем файл побайтово");
    Date d1 = new Date();                       // создаем точку времени
    InputStream is = new FileInputStream(path); // Считываем файл
    first = new byte[is.available()];           // иниц. массив
    while (is.available() > 0) {
        is.read(first);                         // заносим все в массив
    }
    Date d2 = new Date();                       // ставим вторую точку времни
    is.close();
    System.out.println("Все прошло успешно, времени ушло на операцию = " + (d2.getTime() - d1.getTime()) + "мс. " + "Элементов в массиве: " + first.length);


    System.out.println("\n\nТест №2. Считаем файл буфером");
    d1 = new Date();
    InputStream is2 = new BufferedInputStream(new FileInputStream(path));
    second = new byte[is2.available()];
    while (is2.available() > 0) {
        is2.read(second);
    }
    d2 = new Date();
    is2.close();
    System.out.println("Все прошло успешно, времени ушло на операцию = " + (d2.getTime() - d1.getTime()) + "мс. " + "Элементов в массиве: " + second.length);


    System.out.println("\n\nТест№3. Считываем через буфер, переводим в символы и заносим в массив char");
    d1 = new Date();
    FileInputStream fis = new FileInputStream(path);  // Создано, что бы получить длину для массива.
    InputStreamReader isr = new InputStreamReader(new BufferedInputStream(fis));
    third = new char[fis.available()];
    while (isr.ready()) {
        isr.read(third);
    }
    d2 = new Date();
    fis.close();
    isr.close();
    System.out.println("Все прошло успешно, времени ушло на операцию = " + (d2.getTime() - d1.getTime()) + "мс. " + "Элементов в массиве: " + third.length);


    System.out.println("\n\nТест№4. Считываем через буфер и переводим в буффер строк, заносим в ArrayList<String>");
    d1 = new Date();
    //                      Буфер строк    <-     Символы        <-      БуферБайтов <-      Байты     <-Файл
    BufferedReader br = new BufferedReader(new InputStreamReader(new BufferedInputStream(new FileInputStream(path))));
    forth = new ArrayList<>();
    while (br.ready()) {
        forth.add(br.readLine());
    }
    br.close();
    d2 = new Date();
    System.out.println("Все прошло успешно, времени ушло на операцию = " + (d2.getTime() - d1.getTime()) + "мс. " + "Элементов в ArrayList: " + forth.size());
}