Провожу тесты, что бы лучше понять потоки, считывания с файла и запись. Столкнулся с проблемой, сейчас введу в курс дела.
Говорят, что использование буфера значительно ускоряет программу. Я написал код, что бы это проверить. Код считывает "большой" файл и заносит в массивы (файл с текстом на 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());
}