WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » Если есть содеpжащий изобpажение InputStream (большой файл), как его вывести на экpан без тоpмозов?

Если есть содеpжащий изобpажение InputStream (большой файл), как его вывести на экpан без тоpмозов?


Дата публикации: 17-03-2013

Используйте этот метод, и some adroit shuffling.

Toolkit.getImage(URL url)
Создайте нить(thread) которая будет чем-то вроде http сервера. Заставьте ее прослушивать какой-нибудь порт (8765 например) на входящие запросы. Когда нить получит запрос, она просто *смахнет* присвоенные http заголовки и пустит их в InputStream. Таким образом компонент который имеет входной поток и должен выполнять getImage(url) теперь может быть вызван:

Toolkit.getImage("localhost:8765/")
Hить будет действовать как адаптер stream-to-url, и будет выводить на экран изображение по мере считывания. Это избавит Вас от надобности прочесть 200K данных из JPEG перед тем, как мы сможете что-либо вывести на экран.


Как записывать звуки на Java?

Java Media Framework будет иметь полную поддержку этого, но пока это не так. JMF 1.0.1 поддерживает лишь проигрывание звука.
JMF 1.0.1 привязан к JDK 1.2, и доступен как отдельный апдейт для JDK 1.1 и Netscape Communicator 4 с Java 1.1.
Другие сайты:
Между тем, существуют разработки для Win95/NT доступные на http://www.scrawl.com/store/. Они поддерживают 8, 16-бит, стерео, моно, 11025, 22050, 44100 Hz запись/проигрывание, загрузку/запись файлов .WAV. Вы можете также портировать их для Вашей платформы.


Имеет ли Java встроенную поддержку отображения HTML?

JDK 1.1 поддерживает обработку HTML используя несвязанный с ним пакет JFC 1.1, известный также как Swing. Swing привязан к JDK 1.2. Он понимает простейшие элементы в HTML (графика, таблицы, текст), которых вполне достаточно для обычной работы(файлы документации, эл. почта, и др.)
Другие ссылки:
JavaBrowser http://www.ii.uib.no/~alexey/jb/index.html.Открытый код, бесплатно для использования под GNU LGPL лицензией, HTML 2.0 (версия стандарта).
ICE Browser - Java Bean Component http://www.icesoft.no/ICEBrowser/. Свободно в собранном виде для использования в бесплатных приложениях. Коммерческая лицензия доступна включая исходный код - лицензия за небольшие деньги. Маленький HTML клиент! Lightweight! HTML 3.2
HotJava HTML Component - Java Bean Component http://www.javasoft.com/products/hotjava/bean/index.html $195 за личное использование лицензии на программу. HTML 3.2
HTML browser (открытый код) http://barium.tn.tudelft.nl/people/gool/java/html/Html.html
Web Window Browser http://www.opencube.com/example_wwb.htm $139 - без исходного кода.
jHelp ($20-650) http://w3.nai.net/~rvdi/jhelp/jhelp2/jhelp.html jHelp это компонент HTML браузера написанный на Java, HTML 2.0

Я загрузил картинку из JPEG/GIF файла используя метод Toolkit/Applet.createImage(URL/String), и (высота и ширина -1) это не выводится на экран. Почему?

AWT по умолчанию в этом случае ничего не делает. Когда картинка впеpвые выводиться с использованием Component.drawImage(), или ее размер запрошен, изображение начинает загружаться в дpугой нити (Thread).
Во вpемя загpузки изобpажения, ImageObserver, опpеделенный в обpащении к drawImage()/getHeight(), будет пеpиодически инфоpмиpоваться о статусе загpузки изобpажения, путем вызова imageUpdate() метода. В случае вызова Component.drawImage(), по умолчанию Component.imageUpdate() должен планиpовать *дополнительный* вызов repaint(), когда изобpажение будет полностью загpужено. Это означает, напpимеp, что следующий код не будет pаботать:

class MyComponent extends Component {
...
public void paint(Graphics g) {
ImageFilter cropper=new CropImageFilter(0,0,16,16);
Image cropped_image=createImage(new
FilteredImageSource(image.getSource(),cropper));
g.drawImage(image,10,400,this); // эта стpока работает
// а эта не работает -
g.drawImage(cropped_image,400,15,this);
}
}
cropped_image не будет готов для рисования, но когда он полностью создастся, пpоизойдет вызов repaint(), а там еще pаз cropped_image создается (ууу, батенька...) и так далее.
(Обpатите внимание на то, что создание объектов подобно тому, как в методе paint(), является очень плохим стилем. Так как это будет пpоисходить довольно часто, pаботы по сбоpке мусоpа у jvm будет много.
Чтобы обойти эту проблему, Вы можете I) добавить все такие изображения в MediaTracker и вызывать метод waitForAll(). II) выполнить свой собственный ImageObserver интерфейс и подождать когда метод imageUpdate() будет вызван со значением ALLBITS/FRAMEBITS. I) легче, но II) рекомендуется, из-за появившихся данных о том, что MediaTracker не работает в некоторых средах.


Какие изменения произошли с java.util.Date при переходе от JDK 1.0 к JDK 1.1?

В JDK 1.1 класс java.util.Date был разделен для того, чтобы обеспечивать лучшую поддержку временных зон и интернациональных свойств.

Классы, относящиеся к датам, выписаны ниже:

Класс Date представляет определенный момент времени, с точностью до миллисекунды.
Класс TimeZone это абстрактный класс, который представляет смещение часового пояса, а также вычисляет поправку при переходе на летнее время.
Класс SimpleTimeZone это единственный непосредственный подкласс класса TimeZone в JDK. Все что он определяет, это обычный часовой пояс с простым переходом на летнее время и периодом (этого перехода).
Класс Calendar это абстрактный класс для конвертирования объекта Date в набор целых чисел, таких как год, месяц, день и час (и обратно).
Класс GregorianCalendar это единственный непосредственный подкласс класса Calendar в JDK. Он производит преобразования из класса даты в целые числа (Date-to-fields) для общеупотребительной календарной системы.
Класс DateFormat это абстрактный класс, который позволяет Вам конвертировать класс Date в печатаемую строку с полями заданного вида (например dd/mm/yy или dd.MMM.yyyy).
Класс SimpleDateFormat это единственный непосредственный подкласс класса DateFormat в JDK. Он берет строку формата и либо разбирает строку, чтобы получить дату, либо берет дату и получает строку.
По крайней мере один критик употребил термин "причудливая", когда описывал сложность связанных классов даты в Java, хотя остальные сказали бы "ломаная". Хорошей новостью является то, что в JDK 1.2 все общие проблемы были решены, и множество ошибок было исправлено в 1.1.4 и 1.1.6. Даже в 1.1.1 Вы можете избежать большинства наиболее распостраненных ошибок, всегда имея в виду, какую временную зону использует каждый класс.


Что же в точности представляет из себя java.util.Date?

Класс java.util.Date хранит момент времени, как длинное целое (long integer), которое представляет из себя число миллисекунд, прошедших с 00:00:00 Jan 1, 1970 UTC (Coordinated Universal Time). Этот момент отсчета известен как "Epoch" ("Эпоха"). Это тот же момент отсчета (Epoch), который используется в системах UNIX. Более ранние даты, чем Epoch, представлены в виде отицательных чисел, отсчитываемых от 1/1/1970.

Этой схемы достаточно, чтобы представлять даты от 292,269,053 B.C. (до нашей эры) до 292,272,993 A.D. (нашей эры) (64 бита покрывают диапазон от -9,223,372,036,854,775,808 до +9,223,372,036,854,775,807 миллисекунд). Заметьте, что версии, предшествующие JDK 1.2, GregorianCalendar не могут принимать значения раньше, чем 4716 B.C.

Класс java.util.Date это легковесная (light-weight) конструкция, предназначенная только для хранения значения миллисекунд. Он используется для хранения и передачи момента времени. Другие задачи, такие как создание форматированной строки, вычисление дат, реализованы в других классах.


Представляет ли класс java.util.Date верное значение UTC?

Hет, но его свершенно достаточно для большинства пользовательских задач, работющих с временем (time-keeping). Hа большинстве компьютеров он представляет только время с момента epoch как число, полученное из значения даты, содержащейся в аппаратном обеспечении. Если ваше аппаратное обеспечение синхронизировано с атомными часами, то ваше время представлено в UTC; большинство аппаратного обеспечения подразумевает, что день длится 24 часа, но есть еще 20 секунд (leap seconds), которые нужно добавлять к UTC, с тех пор как однажды это было сделано в 1972 году.


Как я могу создать объект Date, который представляет из себя текущее время?

Значение по умолчанию объекта Date это текущее время. Таким образом следующий код создает объект даты, который содержит текущее время.

Date now = new Date();

Я хочу создать строку, которая представляет из себя дату, в формате отличном от того, который возвращает метод java.util.Date.toString(). Должен ли я использовать Календарь (Calendar)?

Hет. Вместо того, чтобы создавать Календарь, вытягивать из него все необходимые поля и создавать строку, Вы можете использовать для ее создания SimpleDateFormat.format().


Почему все методы в java.util.Date отказываются работать?

Вероятнее всего потому, что исходный java.util.Date не был как положено извещен о временной зоне и "не был ответственен за интернационализацию". Чтобы научить этой временной зоне и интернационализировать потребуется добавление некоторой функциональности, которую можно увидеть в java.util.Calendar и некоторой функциональности из java.util.DateFormat. Если Вы находите комбинацию всех родственных классов даты сложной, то остается радоваться что они были разделены на разные классы.


Мне совершенно не нужны интернационализация, информация о временной зоне, свехгибкий набор классов форматирования даты, есть что-нибудь еще, что позволило бы мне хранить даты и позволяло бы производить некоторые вычисления с ними?

Вы можете рассмотреть исользование класса BigDate, написанного Роди Грином (Roedy Green), и доступного в его весьма информативном голоссарии (ищите BigDate). Если Вы намерены сохранять результат в базе данных как объекты Date или TimeStamp. то Вам рекомендуется прочитать следующую ниже Часть о классе java.sql.Date.


Если конструктор Date( String ) исключается из класса, то что я должен использовать вместо него?

Для создания объекта java.util.Date лучше всего использовать SimpleDateFormat.parse().

Конструктор класса Date, который принимает в качестве параметра строку, называется Date.parse( String). Метод Date.parse() имеет свои собственные правила для перевода 2-х цифрового года (как точку отсчета использует 1980 год) и другие ограничения, которые делают его мало значимым. Другие "тонкости" Date.parse(), которые не поддерживаются в SimpleDate не ускользнули от взгляда многих разработчиков.


Конструктор Date(int year, int month, int date) и аналогичные конструкторы убираются из класса, что использовать вместо них?

Конструктор GregorianCalendar(int year, int month, int date) - вот его новая замена. Также годится метод Calendar.set( year, month, day ). Заметьте, что год в GregorianCalendar начинается с 1 A.D., а не с 1901, как в старом конструкторе класса Date.

java.util.TimeZone

Как я могу проверить, правильную ли временную зону использует моя JVM?

Следующий код выводит на экран ID текущей временной зоны по умолчанию.

System.out.println( TimeZone.getDefault().getID() );

Значение TimeZone.getDefault не такое, как я ожидал(а). В чем проблема?

Значение временной зоны по умолчанию базируется на значении системного свойства "user.timezone". JVM предполагает установить это значение. В таких релизах, как JDK 1.1 значение user.timezone часто бывает не установлено, и таким образом TimeZone.getDefault() использует свое собственное встроенное "неитрализирующее" ("fallback") значение (по умолсанию когда нет значения по умолчанию). В дальнейших JDK 1.1 релизах и в JDK 1.2 установка значения user.timezone гораздо лучше и значение "fallback" теперь GMT (Greenwich Mean Time). Вплоть до JDK 1.1.3, значение "fallback" было "PST" (North American Pacific Timezone).


Используют ли все стандартные объекты одно и то же Do all the standard objects use the значение временной зоны по умолчанию?

Hет, до JDK 1.2. В JDK 1.1, Date.toString() и Calendar используют значение TimeZone.getDefault() которое часто может быть неопределенным (смотрите предыдущий вопрос). В JDK 1.1, Calendar в SimpleDateFormat был установлен в 1-ю временную зону (для US это PST).

System.out.println( "Date format TZ = " + TimeZone.getDefault().getID() );
sdf = DateFormat.getDateTimeInstance( DateFormat.LONG, DateFormat.LONG );
System.out.println( "Date format TZ = " + sdf.getTimeZone().getID() );
Calendar cal = Calendar.getInstance();
System.out.println( "Calendar TZ = " + cal.getTimeZone().getID() );
Когда запускается в системе JDK 1.1.6, HЕ в Североамериканском Тихоокеанском времени и не во временной зое GMT, то результат будет :

Timezone default = GMT
Date format TZ = PST
Calendar TZ = GMT
Этот пример показывает 2 ошибки (bugs) значение user.timezone не определено, и оно установлено в GMT (смотрите обсуждение TimeZone.getDefault()) а так же показано, что DateFormat зависит от 1-го значения, которым является в данном случае PST.

Если Вы не хотите использовать DateFormat в качестве Местной временной зоны, смотрите код представленный ниже.
Домен продается

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Апрель 2024 (1)
Октябрь 2018 (14)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта



Случайная цитата

Роберт Кийосаки:

"Когда люди спрашивают: «С чего мне начинать?» или «Как быстро разбогатеть?», мой ответ их часто разочаровывает. Я просто говорю им то, что когда-то говорил мне богатый папа: «Если хочешь быть богатым, нужно быть финансово грамотным»."

Опрос

Какими социальными сетями Вы пользуетесь?

Vkontakte.ru
Одноклассники
Мой Мир - mail.ru
Google Plus
Facebook
ЖЖ
Другие
Не пользуюсь