Какая более быстрая альтернатива методу readLine () BufferedReader?

readLine() возвращает строку, но мне нужны символы ASCII символов каждой строки в каждой строке.

Например.

ABCDE XYZ

Мне нужны символы ASCII A, B, C, D, E, а также X, Y, Z, но отдельно. В настоящее время я использую метод BufferedReaderreadLine, затем перебираю длину строки и использую String.charAt() для извлечения символа в каждой позиции. Преобразование символов в байты становится тривиальным делом.

Я решил, что создавать строки из байтов, а затем преобразовывать их обратно в байты, должно быть дорого. Я попробовал написать собственное решение с использованием FileChannel:

        FileChannel f = FileChannel.open(Paths.get("file.txt"));
        ByteBuffer buffer = ByteBuffer.allocate(10000);
        bytesRead = 0;
        byte[] chunk = new byte[10000];

        while (bytesRead != -1) {
            bytesRead = f.read(buffer);
            buffer.flip();

            while (buffer.hasRemaining()) {
                buffer.get(chunk, 0, bytesRead);
                processChunk(chunk);
            }

            buffer.clear();
        }

Не знаю почему, но это оказалось медленнее, чем метод BufferedReaderreadLine().

Я нашел этот ответ: Почему производительность BufferedReader намного хуже, чем BufferedInputStream?, и мне было интересно, может ли BufferedInputStream помочь мне.

При этом скорость имеет первостепенное значение!

Я не уверен, что означает «символы ASCII A, B, C, D, E», поскольку ABCDE уже являются символами ASCII. Возможно, вы имели в виду ASCII коды этих символов как байтовые значения? Возможно, вам стоит просто прочитать их из BufferedInputStream?

VGR 18.10.2018 05:57

Да извините, я имел ввиду числовые коды.

Fabian 18.10.2018 06:46

@VGR Итак, я попытался использовать BIS, и у меня появляется TLE на странице отправки задания (онлайн-оценщик). repl.it/repls/FloralwhiteIdenticalAtoms Кажется, что readLine () BufferedReader все еще намного быстрее для чтения строк. Есть ли способ прочитать строку (до символа новой строки) без предварительного построения из нее строки, потому что в конечном итоге мне нужны байты, а не строковое представление?

Fabian 18.10.2018 07:35

Не используйте строки вообще. Просто считывайте байты один за другим из InputStream, пока не получите байт, значение которого равно -1 или 10 (значение кодовой точки \n).

VGR 18.10.2018 14:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
280
0

Другие вопросы по теме