Чтение двоичного файла в строку - PullRequest
4 голосов
/ 19 сентября 2011

Это должно быть очевидно, но я не могу понять это.Я потратил на это почти целый день.Я с удовольствием куплю пиво тому, кто сможет меня осветить.

File file = new File(filePath);
byte[] bytes = new byte[(int)file.length()];
DataInputStream dataInputStream = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
dataInputStream.readFully(bytes);           
dataInputStream.close();            
return new String(bytes);

Это мой код.Я вижу, что размер байтового массива не в порядке, но я не могу определить правильный размер.Кроме того, содержание также не является неправильным.Кажется, что только текстовые символы в порядке.

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

Еще одна вещь: содержимое файлане текст, это может быть что-нибудь вроде изображения, видео или pdf.

Ответы [ 2 ]

10 голосов
/ 19 сентября 2011

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

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

0 голосов
/ 20 сентября 2011

Как сказал вам Джон Скит (и вы всегда должны слушать кого-то с 347k!), Если это не текст, не сохраняйте его в строку и сохраняйте как байтовый массив.Также попробуйте commons-io и используйте его вспомогательные классы.

File file = new File(filePath);
InputStream is  = null;
byte[] bytes = null;
try{
    bytes = IOUtils.toByteArray(is);
}finally{
    IOUtils.closeQuietly(is)
}
...