Как мне прочитать файл без буферизации в Java?

Я работаю над проблемами в Programming Pearls, 2-е издание, столбец 1. Одна из проблем заключается в написании программы, которая использует только около 1 мегабайта памяти для хранения содержимого файла в виде битового массива, причем каждый бит представляет, является ли или в файле нет 7-значного числа. Поскольку Java является языком, с которым я наиболее знаком, я решил использовать его, хотя автор, похоже, имел в виду C и C++.

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

я думал InputStreamReader было бы хорошим решением, пока я не прочитал это в документации Java:

Чтобы обеспечить эффективное преобразование байтов в символы, из базового потока может быть прочитано больше байтов, чем необходимо для выполнения текущей операции чтения.

В идеале, только те байты, которые необходимы, будут считаны из потока - другими словами, я не хочу никакой буферизации.

1 ответ

Решение

Одна из проблем заключается в написании программы, которая использует только около 1 мегабайта памяти для хранения содержимого файла в виде битового массива, причем каждый бит показывает, присутствует ли в файле 7-значное число.

Это подразумевает, что вам нужно прочитать файл как байты (не символы).

Предполагая, что у вас есть подлинное требование для чтения из файла без буферизации, вы должны использовать FileInputStream учебный класс. Это не делает буферизацию. Он читает (или пытается прочитать) именно то количество байтов, которое вы запросили.

Если вам необходимо преобразовать эти байты в символы, вы можете сделать это, применив соответствующие String конструктор к byte или же byte[], Обратите внимание, что для многобайтовых кодировок символов, таких как UTF-8, вам нужно будет прочитать достаточно байтов, чтобы завершить каждый символ. Делать это без возможности упреждающего чтения немного сложно... и влечет за собой "знание * кодировки символов, которые вы читаете.

(Вы можете избежать этих знаний, используя CharsetDecoder непосредственно. Но тогда вам нужно использовать decode метод, который работает на Buffer объекты, и это тоже немного сложно.)


Что бы это ни стоило, Java проводит четкое различие между потоком байтов и потоком ввода-вывода символов. Первое поддерживается InputStream а также OutputStreamи последний по Reader а также Write, InputStreamReader класс Reader, который адаптирует InputStream, Вы не должны думать об использовании его для приложения, которое хочет читать вещи побайтно.

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