Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Постраничное чтение большого файла. Использование BufferedInputStream / 8 сообщений из 8, страница 1 из 1
07.03.2018, 12:55
    #39611771
Warl0ck_01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Постраничное чтение большого файла. Использование BufferedInputStream
Есть задача: читать текстовый файл произвольного размера постранично. Страница произвольного размера от 5 до 10000 символов (именно символов, НЕ строк)

Решил воспользоваться BufferedInputStream.

Есть произвольный файл c содержимым:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
kljfshgshgkljshdklfjgsdkljfg sdfgs dfsgdf srgjsegrjhsgt sjtgjshtgjst
rt
dh
d
dyfuyfufyuyg
ugiuiuhoho
hio
ji
o
jio
ji
o
ji
pjopopojkpop



Есть код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
try {
            InputStream in = new BufferedInputStream(new FileInputStream("files/task3"), 8);
            int size = 10;
            byte[] byteArr = new byte[size];
            int x;
            while((x = in.read(byteArr, 0, size)) != -1) {
            }
            in.close();

            for (int i = 0; i < byteArr.length; i++) {
                System.out.print((char) byteArr[i]);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }



Т.е. я хочу считывать в байтовый массив размера size страницу и потом выводить ее.
При выполнении кода выше получается вывод в консоль:
jkpopopopo

Я совсем не могу понять принцип по которому происходит вывод, т.к. выводятся последние 10 символов и при этом даже не по порядку считывания и помещения в массив. Или я неправильно использую BufferedInputStream или неправильно понимаю работу конструкции:
Код: java
1.
2.
while((x = in.read(byteArr, 0, size)) != -1) {
            }
...
Рейтинг: 0 / 0
07.03.2018, 13:06
    #39611779
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Постраничное чтение большого файла. Использование BufferedInputStream
1. Если вам нужны символы, а не байты, то лучше сразу брать Reader/Writer вместо InputStream/OutputStream
2. Да. Вы совсем не понимаете работу конструкции.
3. Если вы хотите читать частями, то при использовании BufferedReader или BufferedInputStream, у вас выйдет двойная буферизация. Не то что бы это плохо. Просто как-то бесполезно.
4. Загляните в Apache Commons IO Utils, вдруг что полезное найдете
...
Рейтинг: 0 / 0
07.03.2018, 14:42
    #39611864
Warl0ck_01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Постраничное чтение большого файла. Использование BufferedInputStream
1. Ок.
2. Поясните плз. Я понимаю while((x = in.read(byteArr, 0, size)) != -1) {} так:
читаем побайтово из потока size байт и записываем в байтовый массив byteArr с позиции 0.

3. Ок.
4. Нужны стандартные средства Java.
...
Рейтинг: 0 / 0
07.03.2018, 14:44
    #39611867
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Постраничное чтение большого файла. Использование BufferedInputStream
Warl0ck_01,

Нет, он не читает "побайтово", он читает столько сколько может прочитать и поместить в буфер. Ваш цикл читает "побуферно" до конца файла. Вы перепутали два разных read() метода.
...
Рейтинг: 0 / 0
07.03.2018, 17:48
    #39611984
Warl0ck_01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Постраничное чтение большого файла. Использование BufferedInputStream
Но ведь он читает из буфера байты?

Вот я выполнил следующий код:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
try {
            InputStream in = new BufferedInputStream(new FileInputStream("files/task3"));
            int size = 10;
            byte[] byteArr = new byte[size];
            int x;
            while((x = in.read(byteArr, 0, size)) != -1) {
                System.out.print((char)x);
            }
            in.close();

            for (int i = 0; i < byteArr.length; i++) {
                System.out.print((char) byteArr[i]);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }



Получил вывод:

Код: java
1.
kpopopopoj



Объясните плз, почему такой вывод?
...
Рейтинг: 0 / 0
07.03.2018, 17:51
    #39611987
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Постраничное чтение большого файла. Использование BufferedInputStream
Warl0ck_01Но ведь он читает из буфера байты?
Нет. Он читает байты из потока в буфер. byteArr это ваш буфер. Вы не пробовали документацию почитать к методу read()?

Warl0ck_01Объясните плз, почему такой вывод?
Потому что вы не прочитали в документации что возвращает метод read()
...
Рейтинг: 0 / 0
12.03.2018, 15:38
    #39613535
Ilya007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Постраничное чтение большого файла. Использование BufferedInputStream
Warl0ck_01Получил вывод:

Код: java
1.
kpopopopoj



Объясните плз, почему такой вывод?

У меня вот другой вывод.

pojkpopopo
...
Рейтинг: 0 / 0
12.03.2018, 15:47
    #39613543
Ilya007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Постраничное чтение большого файла. Использование BufferedInputStream
Задача у вас специфическая, не понял что вы хотите, но вот надеюсь поможет. Установите свои 10000 символов и все будет ок.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Постраничное чтение большого файла. Использование BufferedInputStream / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]