Чтение и запись двоичного файла в Java (видя, что половина файла повреждена) - PullRequest
5 голосов
/ 12 января 2011

У меня есть некоторый рабочий код на python, который мне нужно преобразовать в Java.

Я прочитал немало тем на этом форуме, но не смог найти ответ. Я читаю изображение в формате JPG и преобразую его в байтовый массив. Затем я записываю этот буфер в другой файл. Когда я сравниваю записанные файлы из кода Java и Python, байты в конце не совпадают. Пожалуйста, дайте мне знать, если у вас есть предложение. Мне нужно использовать байтовый массив для упаковки изображения в сообщение, которое необходимо отправить на удаленный сервер.

Java-код (работает на Android)

Чтение файла:

File queryImg = new File(ImagePath);
int imageLen = (int)queryImg.length();
byte [] imgData = new byte[imageLen];
FileInputStream fis = new FileInputStream(queryImg);
fis.read(imgData);

Запись файла:

FileOutputStream f = new FileOutputStream(new File("/sdcard/output.raw"));
f.write(imgData);
f.flush();
f.close();

Спасибо!

Ответы [ 2 ]

5 голосов
/ 12 января 2011

InputStream.read не гарантирует чтение какого-либо определенного количества байтов и может читать меньше, чем вы просили.Он возвращает фактическое прочитанное число, так что вы можете иметь цикл, который отслеживает прогресс:

public void pump(InputStream in, OutputStream out, int size) {
    byte[] buffer = new byte[4096]; // Or whatever constant you feel like using
    int done = 0;
    while (done < size) {
        int read = in.read(buffer);
        if (read == -1) {
            throw new IOException("Something went horribly wrong");
        }
        out.write(buffer, 0, read);
        done += read;
    }
    // Maybe put cleanup code in here if you like, e.g. in.close, out.flush, out.close
}

Я считаю, что в Apache Commons IO есть классы для такого рода вещей, поэтому вам не нужно писать это самостоятельно.

0 голосов
/ 12 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...