У меня проблемы с загрузкой файлов с помощью приложения моей компании, оно вылетает при загрузке файлов размером более 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, поэтому он все равно должен работать с этим.
Я что-то не так делаю?