Как я могу прочитать файл с ASCII и другой кодировкой в ​​Java чисто? - PullRequest
0 голосов
/ 27 августа 2009

У меня есть файл пользовательского изображения, где первый блок данных - это метаданные ASCII. Мне нужно иметь возможность читать эту часть метаданных ASCII файла с помощью Java и знать, когда она заканчивается и когда начинается «необработанные данные изображения» в другой кодировке.

Я думал о том, чтобы прочитать весь файл в байт [], а затем каким-то образом либо начать чтение байтов из этого и преобразовывать их в ASCII, пока я не достигну конца раздела метаданных ascii, после чего я будет хранить эти данные. Тогда я мог бы просто переставить необработанные двоичные данные в другом порядке, как есть (чтение не требуется). Тем не менее, единственный способ, которым я мог бы подумать об этом, - это читать байты ascii побайтно и искать новые строки, и объединять все перед новой строкой и видеть, является ли это тегом, обозначающим начало необработанные данные изображения. Однако должен быть лучший способ чтения части файла ascii с помощью readLine (), а затем возможность немедленно начать с двоичного файла необработанного изображения без необходимости повторно открывать файл в новом считывателе и переходить к строке, где в другой читатель нашел тег 'begin image'.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 27 августа 2009

Не уверен, что вы можете решить формат самостоятельно, но в любом случае:

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

Эта стратегия эффективна, но вы не можете изменить количество текстовых символов ascii без изменения количества.

Кстати, не забывайте обрабатывать ввод: не пытайтесь прочитать больше данных, чем файл содержит или выделить больше памяти, чем способен компьютер.

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

1 голос
/ 27 августа 2009
  • Открыть файл как FileInputStream (завернутый в BufferedInputStream)
  • Создать ByteArrayOutputStream
  • Считывание входного потока побайтно, ищите тэг "begin image", используя алгоритм поиска строки . Приведите отдельные байты к char (это неявно использует ASCII)
  • Одновременно запишите каждый просмотренный вами байт в ByteArrayOutputStream
  • Как только вы нашли тег, вы можете начать чтение данных изображения из входного потока
  • Получить байтовый массив из ByteArrayOutputStream и преобразовать его в строку, используя new String(array, "US-ASCII");

Можно было бы легко выполнить поиск строки, используя Scanner во входном потоке, но вы должны быть осторожны, какой шаблон вы используете, чтобы убедиться, что он найдет пометка без начала чтения данных изображения (поскольку вы сами хотите прочитать это из основного входного потока, на который у вас есть отдельная ссылка).

Редактировать: К сожалению, похоже, что Сканер также неявно использует буфер, поэтому единственная оставшаяся опция - это поиск строки "вручную".

...