powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Побайтовое чтение файла с одновременным парсингом
10 сообщений из 10, страница 1 из 1
Побайтовое чтение файла с одновременным парсингом
    #38474821
_newcomer_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только начал разбираться с файловыми операциями в Java. Используется JDK 7.
Требуется побайтовое сканирование файла с возможностью произвольного позиционирования.
Попробовал сделать через "новомодное" nio2 и соответственно FileChannel.

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

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

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

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

Но вроде как теперь в Java все от nio млеют :)
...
Рейтинг: 0 / 0
Побайтовое чтение файла с одновременным парсингом
    #38474836
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
new BufferedInputStream( NIOInputStream ) ?
...
Рейтинг: 0 / 0
Побайтовое чтение файла с одновременным парсингом
    #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
Побайтовое чтение файла с одновременным парсингом
    #38474864
_newcomer_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛагманNIOInputStream можно скопипастить из org.apache.activemq.transport.nio
Да, спасибо за информацию.
Но как реализовать это руками в общем и так понятно было.
Меня скорее интересовало, есть ли что-то такое готовое в стандартных библиотеках.
Немного удивился с одной стороны большому разнообразию классов, с другой стороны отсутствию (казалось бы) простых очевидных манипуляция с потоками
(к которым привык в другом языке... конкретно в Delphi... просто идет переписывание части кода на Java).
...
Рейтинг: 0 / 0
Побайтовое чтение файла с одновременным парсингом
    #38474871
_newcomer_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя все же что там с произвольным позиционированием при использовании приведенного примера вперед/назад по потоку?
...
Рейтинг: 0 / 0
Побайтовое чтение файла с одновременным парсингом
    #38474874
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще смысл использовать NIO с FileInputStream именно в буферизации известного количества данных, не думаю что есть смысл использовать что-то помимо BufferedInputStream( FileInputStream )
...
Рейтинг: 0 / 0
Побайтовое чтение файла с одновременным парсингом
    #38474875
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_newcomer_, тебе не нужно ничего ломать. Начиная с шестых-седьмых версий обычный RandomAccessFile
и FileInputStream включает в себя зависимости от sun.nio.ch.FileChannelImpl. Так что имеет смысл просто
написать концептуальный код а потом уже смотреть в узкие места.

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

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

На сколько я понимаю у FileInputStream проблема с возвратом назад.
А про RandomAccessFile я не в курсе, может ли он быть буферизованым.
...
Рейтинг: 0 / 0
Побайтовое чтение файла с одновременным парсингом
    #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
Побайтовое чтение файла с одновременным парсингом
    #38474923
_newcomer_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, посмотрю ссылки.
Что касается идеологии и преемственности - тут как всегда проблема универсализации.
Если хочется иметь суперуниверсальный механизм (за счет чего он ограничен в выразительных средствах), то пусть тогда будет альтернатива для более узкого класса задач.
Вроде как тут NIO в помощь. Но как-то со встроенной буферизацией непонятно.
Возвращаясь к потокам - есть же реализации для файлов и памяти, которым не противопоказано произвольное позиционирование, а его нет.
В конце концов операция seek для файлов есть на любых ОС и практически во всех языках программирования.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Побайтовое чтение файла с одновременным парсингом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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