2013-03-20 6 views
0

У меня возникла проблема с новым файловым форматом, который меня просят реализовать на работе.Java: чтение файла, содержащего как текстовые, так и двоичные данные

В принципе, файл представляет собой текстовый файл, содержащий кучу заголовков, содержащих информацию о данных в UTC-8, а затем остальную часть файла представляют собой числовые данные в двоичном формате. Я могу написать данные и прочитать их просто отлично, и я недавно добавил код для записи заголовков. Проблема в том, что я не знаю, как читать файл, содержащий как текстовые, так и двоичные данные. Я хочу иметь возможность читать и обрабатывать информацию заголовка (которая довольно обширна), а затем иметь возможность продолжить чтение двоичных данных без повторной итерации через заголовки. Это возможно?

В настоящее время я использую FileInputStream для чтения двоичных данных, но я не знаю, как запустить его в начале данных, а не в начале всего файла. Один из конструкторов FileInputStream принимает аргумент FileDescriptor, и я думаю, что это мой ответ, но я не знаю, как получить его из другого класса чтения файлов. Правильно ли я подхожу к этому?

+2

Итак, ваш реальный вопрос в том, как установить положение «FileInputStream»? – parsifal

+2

Посмотрите http://docs.oracle.com/javase/tutorial/essential/io/rafs.html – Gene

ответ

0

Вы можете изменить положение FileInputStream в любой произвольной точке, получая его channel через getChannel() и вызова position() на этом канале.

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

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

+0

Мне это не кажется, как будто он знает позицию, к которой он должен стремиться, прежде чем он сможет прочитать двоичный файл данные. – jarnbjo

+0

@jarnbjo - Основываясь на конце своего первого абзаца, кажется, что он знает, где начинаются данные. Но вполне возможно, что он использует что-то вроде «BufferedReader» для обработки текста, поэтому базовая позиция файла недействительна. Возможно, если/когда он вернется, мы выясним. – parsifal

+0

AFAIK, стандартное API не может обернуть InputStream в Reader и поочередно читать символы из Reader и двоичные данные из InputStream. Даже «простой» InputStreamReader может потреблять больше необработанных данных из базового потока, чем фактически преобразован в символы и возвращается методами чтения. – jarnbjo

Смежные вопросы