2011-02-23 3 views
0

Я работаю над оптимизацией памяти фрагмента кода. который отвечает за передачу файла изображения на другой компьютер. Файл изображения - 240 МБ, а текущий размер кучи приложения - 1536 МБ.Проблема с использованием StringBuilder

Текущий код

byte[] buf = new byte[size]; 

while ((num = is.read(buf)) > 0) { 
... 
String str = new String(buf, 0, num)); 
... 
sendToPc(str); 
} 

Это создает много строковых объектов и когда я пытаюсь нажать на изображение для более чем 5 ПК он бежит из кучи. Так я думал, используя строку строитель (я не забочусь о синхронизации)

Но строка строитель не вариант, как

byte[] buf = new byte[size]; 
StringBuilder str = new StringBuilder(size); 
while ((num = is.read(buf)) > 0) { 
... 
str.insert(0,buf); --> Apparently can not append byte array. 
... 
str.delete(0, str.length()); 
} 

И даже если я пытаюсь str.insert(0,new String(buf, 0, num)) это не имеет никакого значения.

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

С уважением

Dheeraj Джоши

ответ

1

Возможно, вы захотите попробовать IOUtils из библиотеки apache common io. Он предоставляет методы для копирования больших файлов. На эту же тему действительно поучительна статья «Причины вздутия, ограничения здоровья».

1

Вы должны отправить изображение в sendToPc в виде строки? Некоторые ByteBuffer будут лучше соответствовать вашим потребностям ...

+0

Да. Требуется. По факту. Метод SendToPc вызывает еще 2 метода и, наконец, передает. Поэтому я не могу изменить отправку части. Поэтому мне нужно что-то сжать в вычислительной части. –

1

Вы не должны использовать строки для хранения двоичных данных. Строки содержат символы. Когда вы вызываете конструктор String, принимающий байтовый массив в качестве аргумента, вы создаете строку на основе кодировки по умолчанию платформы, которая преобразует байты в символы. Javadoc говорит

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

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

Почему вы просто не передаете байты в виде массива байтов?

+0

Проблема заключается в том, что код, который получает это изображение на другом ПК, принимает только строки, а не байтовый массив. И более того, я не контролирую его. –

Смежные вопросы