Как я могу преобразовать большой массив примитивных байтов в массив байтов объектов? - PullRequest
0 голосов
/ 31 октября 2018

У меня проблемы с загрузкой файлов с помощью приложения моей компании, оно вылетает при загрузке файлов размером более 50 МБ.

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

Это прекрасно работает с небольшими файлами, но при загрузке файлов размером более 50 Мб преобразование из bytes[] в Byte[] завершается неудачно.

У меня был такой код:

private RespuestaDescargarDocumento rellenarRespuestaDescarga(byte[] contenido, String nombreDocumento){

        Byte[] bytes = ArrayUtils.toObject(contenido);

        RespuestaDescargarDocumento respuesta = new RespuestaDescargarDocumento();
        respuesta.setContenido(bytes);
        respuesta.setNombreDocumento(nombreDocumento);

        return respuesta;
    }

Я смотрю, что делает toObject(), и я понял, что он выполняет new Byte() каждую итерацию этого цикла, поэтому, если я загружаю файл, например, 52 МБ, он делает 53167398 итераций и для каждой итерации создает новый байт.

public static Byte[] toObject(byte[] array) {
        if (array == null) {
            return null;
        } else if (array.length == 0) {
            return EMPTY_BYTE_OBJECT_ARRAY;
        }
        final Byte[] result = new Byte[array.length];
        for (int i = 0; i < array.length; i++) {
            result[i] = new Byte(array[i]);
        }
        return result;
    } 

Я думаю, что это смешно, поэтому я искал способ сделать это преобразование без этого метода и нашел эту тему:

как преобразовать байт [] в байт [] и наоборот?

И я попробовал лучший ответ, как этот:

private RespuestaDescargarDocumento rellenarRespuestaDescarga(byte[] contenido, String nombreDocumento) {

        //Byte[] bytes = ArrayUtils.toObject(contenido);
        Byte[] bytes = byteToByte(contenido);

        RespuestaDescargarDocumento respuesta = new RespuestaDescargarDocumento();
        respuesta.setContenido(bytes);
        respuesta.setNombreDocumento(nombreDocumento);

        return respuesta;
    }

    private Byte[] byteToByte(byte[] array) {
        if (array == null || array.length == 0) {
            return ArrayUtils.EMPTY_BYTE_OBJECT_ARRAY;
        }
        Byte[] bytes;
        bytes = new Byte[array.length];
        for (int i = 0; i < array.length; i++) {
            bytes[i] = array[i];
        }
        return bytes;
    }

И теперь я могу отлично загрузить этот файл размером 52 МБ, чтобы он работал, или, как я думал, когда я пытался загрузить файл большего размера, размером 150 МБ, он снова завис. На этот раз цикл выполняет 159551619 итераций.

Я получаю следующую ошибку:

java.lang.OutOfMemoryError: Java heap space

В этой строке:

bytes = new Byte[array.length];

Так что он даже не получает цикл for моей функции, как будто Java не может создать массив такого размера (159551619). Но я обнаружил, что максимальный размер массива в Java - 2147483647, поэтому он все равно должен работать с этим.

Я что-то не так делаю?

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