Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Побайтовое чтение файла с одновременным парсингом / 10 сообщений из 10, страница 1 из 1
22.11.2013, 18:50:37
    #38474821
_newcomer_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Побайтовое чтение файла с одновременным парсингом
Только начал разбираться с файловыми операциями в Java. Используется JDK 7.
Требуется побайтовое сканирование файла с возможностью произвольного позиционирования.
Попробовал сделать через "новомодное" nio2 и соответственно FileChannel.

Возник вопрос:
Можно ли обеспечить буферизацию чтения без ручной работы с ByteBuffer и восстановления position?
Т.е. чтобы "давать команду" на чтение только 1 байта и после его анализа остановить работу и соответственно сохранить это положение в канале?
понятно что можно читать по N байт и когда надо переставлять обратно position.
Но есть ли более красивое решение?

Или я вообще зря через nio использую и надо "быть проще" и пользоваться разными InputStream, RandomAccessFile и т.п.?

Файлы достаточно большие для побайтового сканирования (десятки Мб) и соответственно буферизация критична.

Подобная операция на другом языке программирования делалась через буферезированный FileStream.
Тем самым решалась задача сохранения данных в буфере между вызовами функции анализа входных байт (все максимально скрыто от разработчика).

Но вроде как теперь в Java все от nio млеют :)
...
Рейтинг: 0 / 0
22.11.2013, 18:55:13
    #38474836
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Побайтовое чтение файла с одновременным парсингом
new BufferedInputStream( NIOInputStream ) ?
...
Рейтинг: 0 / 0
22.11.2013, 18:57:33
    #38474845
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Побайтовое чтение файла с одновременным парсингом
NIOInputStream можно скопипастить из org.apache.activemq.transport.nio
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
public class NIOInputStream extends InputStream {

    protected int count;
    protected int position;
    private final ByteBuffer in;

    public NIOInputStream(ByteBuffer in) {
        this.in = in;
    }

    public int read() throws IOException {
        try {
            int rc = in.get() & 0xff;
            return rc;
        } catch (BufferUnderflowException e) {
            return -1;
        }
    }

    public int read(byte b[], int off, int len) throws IOException {
        if (in.hasRemaining()) {
            int rc = Math.min(len, in.remaining());
            in.get(b, off, rc);
            return rc;
        } else {
            return len == 0 ? 0 : -1;
        }
    }

    public long skip(long n) throws IOException {
        int rc = Math.min((int)n, in.remaining());
        in.position(in.position() + rc);
        return rc;
    }

    public int available() throws IOException {
        return in.remaining();
    }

    public boolean markSupported() {
        return false;
    }

    public void close() throws IOException {
    }
}
...
Рейтинг: 0 / 0
22.11.2013, 19:11:46
    #38474864
_newcomer_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Побайтовое чтение файла с одновременным парсингом
ЛагманNIOInputStream можно скопипастить из org.apache.activemq.transport.nio
Да, спасибо за информацию.
Но как реализовать это руками в общем и так понятно было.
Меня скорее интересовало, есть ли что-то такое готовое в стандартных библиотеках.
Немного удивился с одной стороны большому разнообразию классов, с другой стороны отсутствию (казалось бы) простых очевидных манипуляция с потоками
(к которым привык в другом языке... конкретно в Delphi... просто идет переписывание части кода на Java).
...
Рейтинг: 0 / 0
22.11.2013, 19:15:05
    #38474871
_newcomer_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Побайтовое чтение файла с одновременным парсингом
Хотя все же что там с произвольным позиционированием при использовании приведенного примера вперед/назад по потоку?
...
Рейтинг: 0 / 0
22.11.2013, 19:18:26
    #38474874
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Побайтовое чтение файла с одновременным парсингом
Вообще смысл использовать NIO с FileInputStream именно в буферизации известного количества данных, не думаю что есть смысл использовать что-то помимо BufferedInputStream( FileInputStream )
...
Рейтинг: 0 / 0
22.11.2013, 19:19:24
    #38474875
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Побайтовое чтение файла с одновременным парсингом
_newcomer_, тебе не нужно ничего ломать. Начиная с шестых-седьмых версий обычный RandomAccessFile
и FileInputStream включает в себя зависимости от sun.nio.ch.FileChannelImpl. Так что имеет смысл просто
написать концептуальный код а потом уже смотреть в узкие места.

И лучше определиться с типом задачи. Если это парсинг текста (в однобайтной кодировке) - то подход один.
Если там надо работать блочно - и данные не являются текстом то подход другой.

Самая лучшая оптимизация - это правильное ТЗ.
...
Рейтинг: 0 / 0
22.11.2013, 19:25:28
    #38474882
_newcomer_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Побайтовое чтение файла с одновременным парсингом
maytonИ лучше определиться с типом задачи...Самая лучшая оптимизация - это правильное ТЗ.
Идет разбор бинарного файла специализированного формата в котором встречаются различные "разделители" по которым парсинг временно прерывается.
Каких-то фиксированных по размеру блоков нет.
Если необходимость обработать тем или иным способом последовательность байт произвольной длины (от 2х байт до 2 Кб), пока не найден разделитель (может состоять не из одного байта).
Время от времени нужно в потоке "возвращаться назад" (да и вообще случаются "прыжки" во все направления).

На сколько я понимаю у FileInputStream проблема с возвратом назад.
А про RandomAccessFile я не в курсе, может ли он быть буферизованым.
...
Рейтинг: 0 / 0
22.11.2013, 19:49:18
    #38474903
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Побайтовое чтение файла с одновременным парсингом
_newcomer_На сколько я понимаю у FileInputStream проблема с возвратом назад.
Да он не ходит назад. Это идея преемственности для работы с сокетами, консольным выводом, PIPEs и многое другое.
Есть надстройки которые обёртывают FileInputStream и позволяют читать взад но это считается
антипаттерном. Идея единоразового чтения считается ТруЪ-кодингом и рациональным подходом
к ресурсам и заложена также в некоторых технологиях БД (Курсоры в Oracle ходят только вперёд).

А про RandomAccessFile я не в курсе, может ли он быть буферизованым.
Он блочный. В идеале вы должны читать кусками кратными сектору (512 bytes - 1K) или какому-то юниту
кратному или удобному для disk volume или LUN.

Читаете побайто. Но из блоков. С разумным подходом можно вести список LRU (как описано тут
http://www.javaspecialist.ru/2012/02/java-lru-cache.html) прочитанных блоков и если будет прыжок
назад то вместо диска с большой вероятностью 80-97% мы попадаем в кеш LRU.

Можно еще попробовать такой паттерн как http://docs.oracle.com/javase/7/docs/api/java/nio/MappedByteBuffer.html.
Здесь ничего не скажу т.к. практически его не использовал. Но может быть очень полезен.
...
Рейтинг: 0 / 0
22.11.2013, 20:08:03
    #38474923
_newcomer_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Побайтовое чтение файла с одновременным парсингом
Спасибо, посмотрю ссылки.
Что касается идеологии и преемственности - тут как всегда проблема универсализации.
Если хочется иметь суперуниверсальный механизм (за счет чего он ограничен в выразительных средствах), то пусть тогда будет альтернатива для более узкого класса задач.
Вроде как тут NIO в помощь. Но как-то со встроенной буферизацией непонятно.
Возвращаясь к потокам - есть же реализации для файлов и памяти, которым не противопоказано произвольное позиционирование, а его нет.
В конце концов операция seek для файлов есть на любых ОС и практически во всех языках программирования.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Побайтовое чтение файла с одновременным парсингом / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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