Чтение файла с помощью сканера Java - PullRequest
6 голосов
/ 04 октября 2010

Одна из строк в Java-файле, который я пытаюсь понять, как показано ниже.

return new Scanner(file).useDelimiter("\\Z").next();

Ожидается, что файл вернется к «Концу ввода, но для конечного терминатора, если таковой имеется» согласно документации java.util.regex.Pattern. Но происходит то, что он возвращает только первые 1024 символа из файла. Является ли это ограничение наложенным на регулярное выражение? Можно ли это преодолеть? В настоящее время я собираюсь использовать программу для чтения файлов. Но я хотел бы знать причину такого поведения.

Ответы [ 4 ]

5 голосов
/ 04 октября 2010

Сам я не мог воспроизвести это.Но я думаю, что могу пролить свет на то, что происходит.

Внутри сканер использует буфер символов из 1024 символов.Сканер будет по умолчанию читать ваши читаемые 1024 символа, если это возможно, и затем применять шаблон.

Проблема в вашем шаблоне ... он всегда будет соответствовать концу ввода, ноt означает конец вашего входного потока / данных.Когда Java применяет ваш шаблон к буферизованным данным, она пытается найти первое вхождение конца ввода.Поскольку в буфере находится 1024 символа, соответствующий механизм вызывает позицию 1024 как первое совпадение разделителя и все, прежде чем он будет возвращен в качестве первого токена.действительно для использования в Сканере по этой причине.В конце концов, это может быть чтение из бесконечного потока.

2 голосов
/ 04 октября 2010

Попробуйте обернуть объект file в FileInputStream

1 голос
/ 04 октября 2010

Scanner предназначен для чтения нескольких примитивов из файла.Это действительно не предназначено для чтения всего файла.

Если вы не хотите включать сторонние библиотеки, вам лучше зацикливаться на BufferedReader, который оборачивает FileReader / InputStreamReader для текста или циклическое выполнение по FileInputStream для двоичных данных.

Если вы в порядке, используя стороннюю библиотеку, Apache commons-io имеет FileUtils класс, содержащий статические методы readFileToString и readLines для текста и readFileToByteArray для двоичных данных ..

0 голосов
/ 02 мая 2013

Вы можете использовать класс Scanner, просто укажите набор символов при открытии сканера, то есть:

Scanner sc = new Scanner(file, "ISO-8859-1");

Java преобразует байты, прочитанные из файла, в символы, используя указанную кодировку, которая используется по умолчаниюодин (из базовой ОС), если ничего не дано ( источник ).Мне до сих пор не ясно, почему Scanner считывает только 1024 байта со стандартным, а с другим достигает конца файла.Во всяком случае, это работает отлично!

...