LINUX.ORG.RU

Ответ на: комментарий от Ian

FileOutputStream fos = new FileOutputStream( ... );
ObjectOutputStream oos = new ObjectOutputStream( fos );

Ian ★★
()
Ответ на: комментарий от Ian

Да, я уже нашел, но я расщитывал записать просто значения массива последовательно и все, а тут весть объект серится. Почему простые вещи надо делать через жопу?

Nalyvajko
() автор топика
Ответ на: комментарий от Ian

Да не толсто, просто я в яве новичек. Все жизнь писал на С\С++. Думал сделать как привык а тут дудки. Бесит.

Nalyvajko
() автор топика
Ответ на: комментарий от Ian

Нашел я WriteInt, но это что ж, в цикле поинтово писать? Мне надо быстро. Задача такая. Надо самбнейлы картинок сгенерить а потом их эффективно подкачивать по мере прокрутки. Решил залить их несжатыми в один файл и потом промапить файл в память, создавать битмэпки указывая им где нужный кусок данных в памяти. Вот на первом же этапе застрял. Знаю что на С сделать это - раз плюнуть а тут как рыба на суше.

Nalyvajko
() автор топика
Ответ на: комментарий от Ian

Ну ладно обижаться, мне не до флейма, просто вышел маленько из себя. Ява хорошая, хорошая.

Nalyvajko
() автор топика
Ответ на: комментарий от wfrr

thumbnails - маленькие масштабированые картинки, уменьшеные для предпросмотра.

Nalyvajko
() автор топика
Ответ на: комментарий от Karapuz

2Карапуз. Спасибо. Но это тоже небыстро. Поэлементный кастинг будет работать очень медленно.

Nalyvajko
() автор топика
Ответ на: комментарий от Nalyvajko

FileOutputStream fos = new FileOutputStream("test.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);

int[] writeArray = new int[]{10, 20, 30, 40};

oos.writeObject(writeArray);

FileInputStream fis = new FileInputStream("test.txt");
ObjectInputStream ois = new ObjectInputStream( fis );

int[] readArray;

readArray = ( int[] )ois.readObject();

for(int i = 0; i < readArray.length; i++)
{
    System.out.println(readArray[i]);
}	

Ian ★★
()
Ответ на: комментарий от Ian

2 Лан. Молодой человек, мне нужно не проще, а эффективней. Собсно уже есть написаный и работающий код, но написан он в духе предланаемых тут советов и поэтому работает меееедлено. А надо быстро.

Nalyvajko
() автор топика
Ответ на: комментарий от Ian

Ну пожалуй с writeObject можно смириться, хотя не совсем то, а как его потом из memory mapped file воссоздать? То есть из буфера?

Nalyvajko
() автор топика
Ответ на: комментарий от Nalyvajko

Если бы ты меньше дерзил, возможно тебе больше людей бы ответило. Ты уверен, что у тебя медленно именно из-за тех проблем, о которых тут спрашиваешь? Судя по твоим знания Java медленно может быть из-за чего угодно.

Ian ★★
()
Ответ на: комментарий от Nalyvajko

Попробуй все же сделать через RandomAccessFile. Сначала делай writeInt в цикле. А потом seek куда надо и readInt.

Ian ★★
()
Ответ на: комментарий от Ian

И зачем тебе все thumbnails грузить в память? Разве у мобильных устройств она такая большая? Мне кажется лучше читать напрямую из файла.

Ian ★★
()
Ответ на: комментарий от Nalyvajko

> Нашел я WriteInt, но это что ж, в цикле поинтово писать? Мне надо быстро.

Пиши в цикле. Главное - не забудь поверх FileOutputStream создать BufferedOutputStream, и уже в него писать данные. Вот если в этом случае тебе не хватит скорости - тогда уже думай насчёт усложнений, смены формата сохранения картинки или смены языка.

alexsaa
()
Ответ на: комментарий от Nalyvajko

> Почему простые вещи надо делать через жопу?

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

alexsaa
()
Ответ на: комментарий от Nalyvajko

Нашел решение проблемы. Кому интересно:

fos = new FileOutputStream("/sdcard/array.bin");
int arr[] = new int[5];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;

ByteBuffer bb = ByteBuffer.allocate(5);
IntBuffer intb = bb.asIntBuffer();
intb.put(arr);
fos.write(bb.array());

Только не понял, нужно ли аллоцировать байт баффер. С этим потом разберемся.
2lan
Я не собираюсь грузить самбнейлы в память, пусть этим заниметеся линукс по мере необходимости - вот тебе и первая выгода. На то он и мемори маппед файл.
У меня на хипе(куче) ограничение, а ММФ туда не вкючается - вот тебе и вторая выгода.

Nalyvajko
() автор топика
Ответ на: комментарий от Nalyvajko

Интересное решение. Вот видишь! Надо почитать и все получится!

> Я не собираюсь грузить самбнейлы в память, пусть этим заниметеся линукс по мере необходимости - вот тебе и первая выгода. На то он и мемори маппед файл. У меня на хипе(куче) ограничение, а ММФ туда не вкючается - вот тебе и вторая выгода.

Отлично. =)

P.S. Спасибо, что запостил решение. Возможно кому-то пригодится!

Ian ★★
()
Ответ на: комментарий от Nalyvajko

> int arr[] = new int[5];
> ...

> ByteBuffer bb = ByteBuffer.allocate(5);


Мне одному кажется, что если число 5 поменять на более другое число, есть вероятность некоторой жопы?

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Да, но это я уже в брозере редактировал для простоты илюстрации. Там у меня более сложное выражение. Кроме того, 5 тоже не годится - надо 5*sizeof(int)

Nalyvajko
() автор топика
Ответ на: комментарий от LamerOk

Я это вдуплил еще в начале, когда ставил под сомнение необходимисть второй аллокации. Но она таки нужна. По крайней мере я не знаю как прокастить int[] в byte[] без копирования. Думается, это в принципе не возможно. Такова идеология жабы. С мемори маппед файлами тоже жопа вышла. Нет в них никакого толку без возможности маппировать на них объекты. Не понимию, зачем они вообще нужны в Яве.

Nalyvajko
() автор топика
Ответ на: комментарий от Nalyvajko

Может стандартное API все-таки глянешь? Для images в том числе. Или надо обязательно тупо изобретать велосипед, матеря все вокруг?

prasthita
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.