admin / 05.05.2018

Примеры кода на java

Программа UploadServer — пример простейшего серверного приложения на языке Java. Приводится исходный код с подробными объяснениями работы каждого фрагмента. Прдставляет интерес для тех, кто только начинает осваивать программирование на языке Java.

Содержание

Описание программы

Программа UploadServer — простейший узкоспециализированный web-сервер, предназначенный для закачки файлов на компьютер, на котором он запущен. Он был написан мною на языке Java, причем я преследовал две цели: сделать программу, которой удобно перекидывать файлы в локальной (и не только) сети без установки и настройки громоздкого софта, а также сделать простой, но функциональный и богатый разными «фичами» пример серверного приложения на Java.

Порядок работы с программой не менее прост, чем она сама. Вы запускаете программу, указав в командной строке номер порта (он должен быть разрешен в фаерволе для доступа снаружи), после чего с компьютера, где есть файлы для загрузки, заходите на свой компьютер обычным web-браузером. В появившейся форме выбираете нужный файл кнопкой "Browse…" и нажимаете кнопку "Upload". После успешной загрузки файла будет отображена страница с указанием размера и MD5-суммы загруженного файла.

Для работы программы требуется Java Runtime Environment версии не ниже 1.4 (я проверял на 1.6, но если верить документации, все необходимые функции появились не позже 1.4). Скачать последнюю версию платформу можно с официального сайта Java . Если вы планируете не только смотреть на программу, но и модифицировать ее, то вам потребуется еще и Java-компилятор, который вместе с прочими полезными в разработке утилитами входит в состав Java Development Kit (JDK), который можно скачать там же.

Скачать программу

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

Программа поставляется в виде архива содержащего исходный текст (файл UploadServer.java) и откомпилированный класс (файл UploadServer.class)

Программа UploadServer (архив Zip, 5 k)

Для запуска программы наберите в каталоге с откомпилированным файлом UploadServer.class следующую строку:

java -cp . UploadServer <номер порта>

Разбор исходного текста программы

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

За каждым блоком кода следует короткий комментарий о его назначении.

Сведения о программе, об авторе, а также лицензионное соглашение.

/** UploadServer program — simple file upload web-server Author: Denis Volkov (c) 2007 For information and support visit http://www.denvo.ru This program is FREEWARE, you are free to use any part of code as well as whole program in your development provided that you remain original copyrights and site name in your source. The product is distributed "as is". The author of the Product will not be liable for any consequences, loss of profit or any other kind of loss, that may occur while using the product itself and/or together with any other software. */

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

Импорт используемых классов

import java.net.*; import java.io.*; import java.security.*; import java.util.*; import java.util.regex.*; import java.nio.charset.*;

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

Заголовок класса и определение переменных

public class UploadServer extends Thread { private final static String httpHeader = "HTTP/1.1 200 OK\r\n" + "Content-Type: text/html\r\n" + "\r\n"; private final static String uploadFormString = httpHeader + "<form method=\"POST\" enctype=\"multipart/form-data\">\r\n" + "<input type=\"file\" name=\"upload_file\" size=100>\r\n" + "<input type=\"submit\" value=\"Upload\">\r\n" + "</form>\r\n\r\n"; private final Charset streamCharset = Charset.forName("ISO-8859-1"); private ServerSocket serverSocket; private Socket clientSocket;

Описание класса начинается с его заголовка, в котором указывается имя класса, тип доступа к нему, имя базового класса при наследовании, имена интерфейсов, реализуемых классом. В нашем случае описывается публичный класс (чтобы его можно было указывать в качестве стартового), который унаследован от класса Thread, поэтому является потоком.
Далее определяются переменные класса (с модификатором static, т.е. они будут общие для всех создаваемых объектов), содержащие строки для формирования ответа клиенту, а также переменные объекта. Переменная httpHeader содержит заголовок ответа. Согласно стандарту, он должен содержать версию протокола, тип ответа в виде числа и текстовое пояснение в первой строке, а также параметр Content-Type, определяющий MIME-тип передаваемых данных. Переменная uploadFormString дополнительно к заголовку содержит HTML-код формы отправки файла на сервер.
В переменной streamCharset хранится ссылка на объект Charset, используемый для преобразования получаемых из сети байтов в символы, а также символов в байты при записи файла. В двух других переменных хранятся ссылки на серверный сокет и клиентский сокет после установления соединения.

Конструктор класса

UploadServer(int port) throws Exception { serverSocket = new ServerSocket(port); System.err.println("Server ready @" + port); }

Конструктор — специальная функция, вызываемая при создании объекта. Здесь конструктор получает в качестве аргумента номер порта, на котором будет создан сервер, создает серверный сокет, слушающий указанный порт, и печатает сообщение об успешном запуске.
При создании сокета может возникнуть исключение, поскольку конструктор не обрабатывает его самостоятельно, а передает исключение в вызывающий код, о чем сообщается в заголовке функции (throws Exception).

Функция, с которой начинается исполнение потока

public void run() { while(true) { try { clientSocket = serverSocket.accept(); System.err.println("Client connection accepted from " + clientSocket.getInetAddress().toString()); // Read and process data from socket processConnection(); } catch(Exception e) { System.err.println("Exception in run’s main loop"); e.printStackTrace(); } // Close socket try { clientSocket.close(); } catch(Exception e) { } System.err.println("Client connection closed"); } }

Функция run() вызывается из базового класса Thread в созданном новом потоке. В ней создается бесконечный цикл приема соединений от клиентов. В начале вызывается функция accept серверного сокета, которая ожидает входящего соединения и возвращает сокет для созданного соединения. Адрес клиента, возвращенный функцией getInetAddress(), используется в выдаваемом диагностическом сообщении, затем вызывается processConnection() для приема и обработки данных от клиентов. Когда последняя возвратит управление, соединение с клиентом завершается и программа переходит к ожиданию нового соединения.
В коде функции использованы два блока обработки исключений. Первый ловит все исключения, возникающие при приеме и обработке соединения, в случае возникновения исключения выводится диагностическое сообщение и стек вызовов в точке исключения (функция printStackTrace()). Второй блок просто ловит исключения, который возможны при закрытии клиентского сокета, но никаких действий не предпринимает.

Функция обработки соединения с клиентом — определение переменных

private void processConnection() throws Exception { InputStream inStream = clientSocket.getInputStream(); BufferedReader in = new BufferedReader( new InputStreamReader(inStream, streamCharset)); OutputStream out = clientSocket.getOutputStream();

Вначале создаются объекты для обмена данными с клиентом. Для чтения данных, отправляемых клиентом, сокет предоставляет поток, унаследованный от класса InputStream (мы не знаем, какой будет класс у реального объекта, но нам это и не нужно, т.к. InputStream предоставляет нам необходимый абстрактный интерфейс для чтения данных). Чтобы читать данные из сокета построчно, мы создаем цепочку читателей: первый InputStreamReader читает байты из потока и преобразует их в символы, используя streamCharset, второй BufferedReader озволяет читать строчку вместо посимвольного чтения с проверкой конца строки. Используемый Charset ISO-8859-1 производит перевод байтов в символы и наоборот «1 в 1», поэтому его можно использовать для двоичных файлов без риска искажения данных.
Для передачи данных клиенту используется выходной поток, возвращаемый функцией getOutputStream().

Чтение заголовка клиентского запроса

// Read requiest header String headerLine, firstLine = null; Map headerData = new TreeMap(); Pattern headerPattern = Pattern.compile("([^\\:]+)\\:(.*)"); while((headerLine = in.readLine()).length() > 0) { if(firstLine == null) firstLine = headerLine; else { Matcher m = headerPattern.matcher(headerLine); if(m.matches()) { headerData.put(m.group(1).trim(), m.group(2).trim()); } } System.out.println("HEADER: " + headerLine); }

Заголовок запроса в протоколе HTTP  состоит из первой строки формата
МЕТОД ИМЯ_РЕСУРСА ВЕРСИЯ_ПРОТОКОЛА
за которыми следуют строки формата
ИМЯ_ПАРАМЕТРА: ЗНАЧЕНИЕ_ПАРАМЕТРА
заголовок завершается пустой строкой. Мы читаем данные, отправленные клиентом, построчно до пустой строки, первую из прочитанных строк сохраняем отдельно в переменной firstLine, остальные разбираем с помощью регулярного выражения на имя и значение параметра и сохраняем в индексированной таблице headerData. Для такого разбора предварительно создается объект Pattern, который содержит подготовленное функцией compile(String) регулярное выражение. Функция matcher(String) этого объекта разбирает переданную строку с помощью подготовленного регулярного выражения и создает объект Matcher, содержащий результаты разбора. Функция group(int) объекта Matcher возвращает строки, которые при разборе попали в группы (задаваемые в регулярном выражении круглыми скобками). В отладочно-демонстрационных целях каждая прочитанная строка печатается на консоль.
Строго говоря, протокол допускает разбиение длинных строк в заголовке на две и более (вторая и последующие строки должны начинаться с пробела или табуляции), однако для простоты кода данный случай здесь не обрабатывается.

Обработка запроса типа "GET"

// Process first line of request if(firstLine.startsWith("GET")) { System.out.println("Send upload form"); // Show upload form out.write(uploadFormString.getBytes()); }

Если первая строка запроса начинается со строки "GET", клиенту просто отправляется заранее сформированный ответ с HTML-документом, содержащим форму для отправки файла.

Обработка запроса типа "POST", определение переменных

else if(firstLine.startsWith("POST")) { // Get body info int contentLength = Integer.parseInt((String)(headerData.get("Content-Length"))); String contentType = (String)(headerData.get("Content-Type")); String boundary = "\r\n—" + contentType.substring(contentType.indexOf("boundary=") + 9) + "—"; System.out.println("File upload, reading body: " + contentLength + " bytes"); // Prepare to reading Pattern fileNamePattern = Pattern.compile("filename=\"([^\"]+)\""); OutputStreamWriter writer = null; MessageDigest digestMD5 = MessageDigest.getInstance("MD5"); String fileName = null; String prevBuffer = ""; char[] buffer = new char[16 << 10]; int totalLength = contentLength;

В случае, если тип запроса клиента начинается со строки "POST", мы предполагаем, что была отправлена форма с загружаемым файлом. Вначале по параметру Content-Length из заголовка определяется длина передаваемых данных. Далее, поскольку данные будут передаваться клиентом в формате MIME, необходимо получить разделитель из параметра Content-Type и сформировать из него строку-разделитель для определения конца передаваемого файла (приложение А второй части описания формата MIME ). Для поиска оригинального имени файла (на клиентской машине) формируется регулярное выражение в переменной fileNamePattern. Для подсчета контрольной суммы принятого файла создается объект MessageDigest с использованием алгоритма хэширования MD5. Также определяются переменные для записывателя (writer), имени файла, создается буфер для чтения файла buffer.

Цикл чтения тела запроса, обработка заголовка формы

// Reading loop while(contentLength > 0) { if(writer == null) { // Read strings String bodyLine = in.readLine(); contentLength -= bodyLine.length() + 2; // Find name of file if(bodyLine.length() > 0) { Matcher m = fileNamePattern.matcher(bodyLine); if(m.find()) { fileName = m.group(1); } } else if(fileName != null) { OutputStream stream = new FileOutputStream(fileName); if(digestMD5 != null) stream = new DigestOutputStream(stream, digestMD5); writer = new OutputStreamWriter(stream, streamCharset); } else throw new RuntimeException("Name of uploaded file not found"); }

При отправке формы по HTTP в формате multipart/form-data для каждого поля file в форме создается блок, разделенный строками-ограничителями, который состоит из текстовых полей с именем файла, а также отделенным от них пустой строкой блоком двоичных данных самого файла. В данной части кода мы читаем текстовые поля и ищем в них имя файла с помощью регулярного выражения. Поскольку в данном случае регулярное выражение охватывает не всю строку, а только ее часть, для проверки наличия подстроки используется метод find() вместо метода matches() в разборе заголовка запроса.
После чтения пустой строки производится создание объектов для чтения самого присланного файла. Если имя файла не было найдено, создается исключение типа RuntimeException с поясняющей текстовой строкой. Если же имя было найдено, создается выходной файловый поток в файл с указанным именем в текущем каталоге. Также создается прозрачный поток DigestOutputStream, который при записи в него направляет копию данных в объект digest для подсчета «на лету» контрольной суммы принятого файла. Для преобразования символов в байты для записи создается записыватель с использованием того же Charset, что и при чтении.

Чтение данных отправленного файла и запись их на диск

else { // Read data from stream int readLength = Math.min(contentLength, buffer.length); readLength = in.read(buffer, 0, readLength); if(readLength < 0) break; contentLength -= readLength; // Find boundary string String curBuffer = new String(buffer, 0, readLength); String bothBuffers = prevBuffer + curBuffer; int boundaryPos = bothBuffers.indexOf(boundary); if(boundaryPos == -1) { writer.write(prevBuffer, 0, prevBuffer.length()); prevBuffer = curBuffer; } else { writer.write(bothBuffers, 0, boundaryPos); break; } } // Write stats System.out.print("Read: " + (totalLength — contentLength) + " Remains: " + contentLength + " Total: " + totalLength + " bytes \r"); }

После того, как были приняты текстовые строки из тела сообщения и создан записыватель, в каждой итерации цикла происходит чтение данных в буфер и поиск среди прочитанных данных сигнатуры конца данных файла, сформированной ранее. Поскольку сигнатура может встретиться на границе двух прочитанных порций данных, используется двойная буферизация с использованием строки prevBuffer: сигнатура ищется в строке bothBuffers, составленной из предыдущей и новой порций прочитанных данных, и в случае, если она не найдена, в файл записываются данные из предыдущей порции. Если же сигнатура найдена, в файл записывается остаток составного буфера до сигнатуры и цикл завершается.
Описанный алгоритм работает правильно только если принятая порция данных больше длины строки-разделителя, что обеспечивается использованием буферизованного чтения (исходный входной поток сокета может вернуть управление из функции read, прочитав лишь 1 байт).
В конце каждой итерации выводится состояние процесса чтения (число прочитанных и оставшихся до конца тела запроса байт).

Завершение приема файла, отправка ответа клиенту

System.out.println("Done "); writer.close(); // Finalize digest calculation byte[] md5Sum = digestMD5.digest(); StringBuffer md5SumString = new StringBuffer(); for(int n = 0; n < md5Sum.length; ++ n) md5SumString.append(printByte(md5Sum[n])); // Output client info String answer = httpHeader + "<p><b>Upload completed, " + totalLength + " bytes, MD5 sum: " + md5SumString.toString() + "</b>" + "<p><a href=\"/\">Next file</a>\r\n\r\n"; out.write(answer.getBytes()); } }

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

Служебная функция перевода байта в шестнадцатеричную строку

private static String printByte(byte b) { int bi = ((int)b) & 0xFF; if(bi < 16) return "0" + Integer.toHexString(bi); else return Integer.toHexString(bi); }

Функция используется для печати MD5-суммы в ответе клиенту. Она получает байт, преобразует его в целое с отбрасыванием старших байтов (поскольку байт — знаковый тип, то в случае отрицательных значений у целого старшие байты будут иметь значение 0xFF). Затем используется статический метод toHexString класса Integer, который преобразует целое в шестнадцатеричную строку. Этот метод печатает только значащие цифры, поэтому для чисел, меньших 16, необходимо дополнить полученную строку символом "0" слева.

Функция main

public static void main(String[] args) { try { if(args.length < 1) { System.out.println("Usage: UploadServer <port>"); return; } UploadServer server = new UploadServer(Integer.parseInt(args[0])); server.start(); } catch(Exception e) { System.err.println("Error in main"); e.printStackTrace(); } } }

Исполнение программы на языке Java начинается с функции main класса, который указан в качестве стартового в командной строке. Это статическая функция, она вызывается, когда ни одного объекта данного класса еще не создано. Функция должна быть описана именно так, как в данном примере, иначе при запуске программы возникнет ошибка java.lang.NoSuchMethodError (не найден метод).
Функция main получает параметры командной строки в виде массива строк. В нашем случае функция main проверяет количество аргументов, сравнивая длину массива с единицей, если нет ни одного аргумента, то в консоль печатается информация о формате командной строки и программа завершается. Если же пользователь указал хотя бы один аргумент, то создается объект класса UploadServer, причем конструктору передается первый аргумент, преобразованный в число, а затем у созданного объекта вызывается метод start. Это метод базового класса Thread, который создает новый поток, вызывает в нем метод run и возвращает управление. Таким образом первый поток, в котором была вызвана функция main, завершается, но программа продолжает работать в новом потоке до завершения функции run.

Полезные ссылки

 

1. Java примеры — Изучение на примерах и задачах

IBM подключилась к участию в проекте open-source Java Harmony и намерена передать ему собственный код.
На прошлой неделе IBM выделила сотрудников для работы с проектом open source, который ведет Apache Software Foundation, — об этом сообщил вице-президент IBM по передовой технологии Роб Смит. На сегодняшний день участие IBM ограничивается размышлениями над проектом, но компания, вероятно, вложит в него собственный код, сказал Смит. «Думаю, что в будущем вы увидите некоторый код. Я в этом уверен. Но сейчас эти люди занимаются обдумыванием некоторых идей и конструкций, — сказал он. — У нас есть кое-какие идеи, и я надеюсь, что они будут включены в общую стратегию Harmony».
  Проект Harmony был запущен в мае для создания open-source редакции Java Platform, Standard Edition (Java SE), программного обеспечения, необходимого для исполнения Java-программ на настольных ПК.
Смит сказал, что IBM решила дождаться, пока прояснятся направление и цели проекта. «Мы рады, что сообщество приступило к работе, и пока идет уточнение того, что оно хочет получить в результате. Мы не хотели бы вмешиваться в это».
IBM давно дала понять, что хорошо бы иметь open-source редакцию Java. В прошлом году Смит направил открытое письмо Робу Гинджеллу, тогдашнему вице-президенту Sun Microsystems, призывая компанию открыть исходный код Java. Sun отказалась под тем предлогом, что open-source редакции Java могли привести к расколу стандарта и вызвать проблемы совместимости. Однако Sun все же изменила свою лицензионную политику, облегчив доступ к коду Java SE и дополнив его.
Пока ни IBM, ни распорядитель Java, Sun, официально не приняли участие в проекте, хотя сотрудники обеих компаний выразили ему свою поддержку. Однако в кругах разработчиков уже ходили слухи о том, что IBM подключится к Harmony и вложит в проект значительные куски кода.
У IBM уже есть собственная виртуальная машина Java — один из компонентов Java SE — и богатый опыт в области Java. В мае IBM приобрела компанию Gluecode, распространяющую сервер приложений Java с открытым исходным кодом, в которой работают эксперты по open-source Java, включая Гира Магнуссона-младшего, одного из основателей Project Harmony.

http://news.com.com/IBM+steps+into+open-source+Java+project/2100-7344_3-5798290.html 

Java игра Пятнашки — Swing GUI

2006-03-07 Графический интерфейс на Java

Дело было вечером. Делать было нечего.

Вот и решил написать простенькую игрушку на Java. Первое, что пришло на ум, — знаменитая игра «пятнашки». Дружественный интерфейс 🙂 решено было создать с использованием Java Swing.

Скачать игру можно здесь — Пятнашки (5Kb). Предполагается, что как минимум JRE — Java Runtime Environment — у вас есть. Если так — просто дваджы кликните на pyatnashki.jar или по-взрослому запустите из консоли с помощью команды:

java -jar pyatnashki.jar

С момента написания мною этого поста, уже более 100 человек просили выслать им исходный код. Конечно же все просьбы я удовлетворил. Думаю, все-таки стоит выложить исходный код и алгоритм данной программы на всеобщее обозрение — скачать java код пятнашек.

Код писался давно (в 2005 году) и на скорую руку, так что не судите строго. Как-нибудь обязательно найду время и приведу все в порядок.

Ну а пока что несколько комментариев по коду. Кстати, небольшую обзорную статью про Java Swing можно найти здесь.

Для создания меню написан следующий метод:

private void createMenu() { JMenuBar menu = new JMenuBar(); JMenu fileMenu = new JMenu(«File»); for (String fileItem : new String [] { «New», «Exit» }) { JMenuItem item = new JMenuItem(fileItem); item.setActionCommand(fileItem.toLowerCase()); item.addActionListener(new NewMenuListener()); fileMenu.add(item); } fileMenu.insertSeparator(1); menu.add(fileMenu); setJMenuBar(menu); }

В экземпляр класса JMenuBar — специальной панели для меню — добавляем необходимые нам менюшки. В нашем случае это File, который состоит из нескольких пунктов JMenuItem.

С каждым пунктом меню можно ассоциировать слушатель события нажатия пользователем. Я сделал общий слушатель — NewMenuListener, который наследуется от ActionListener. Чтобы различать пункты меню, предварительно для каждого пункта был установлен алиас с помощью вызова setActionCommand. Для группировки пунктов меню пригодится метод insertSeparator.

Метод generate случайным образом размещает пятнашки. Вы наверное обратили внимание на то, что генерация происходит в цикле до тех пор, пока метод canBeSolved не вернет значение true.

Все дело в том, что половина всех возможных комбинаций пятнашек не имеет решения.

Главное меню

То есть вы получите практически собранную головоломку, в которой цифры 14 и 15 перепутаны местами.

private boolean canBeSolved(int[] invariants) { int sum = 0; for (int i = 0; i < 16; i++) { if (invariants[i] == 0) { sum += i / 4; continue; } for (int j = i + 1; j < 16; j++) { if (invariants[j] < invariants[i]) sum ++; } } System.out.println(sum % 2 == 0); return sum % 2 == 0; }

Способ определения того, является ли комбинация решаемой, был взят с Wikipedia:

Пусть квадратик с числом i расположен до (если считать слева направо и сверху вниз) k квадратиков с числами меньшими i. Будем считать n_i = k , то есть если после костяшки с i-м числом нет чисел, меньших i, то k = 0. Также введем число e — номер ряда пустой клетки (считая с 1). Если сумма

является нечётной, то решения головоломки не существует.

Наконец, метод checkWin проверят после каждого хода, решена ли головоломка.

Если решена, то выводится сообщение о победе.

Чтобы вывести всплывающее сообщение используется метод JOptionPane.showMessageDialog(). MessageDialog бывают нескольких видов и определяются константами:

  • сообщение об ошибке — ERROR_MESSAGE;
  • информационное сообщение — INFORMATION_MESSAGE;
  • предупреждение — WARNING_MESSAGE;
  • вопрос — QUESTION_MESSAGE;
  • обічное сообщение — PLAIN_MESSAGE.

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

Вот и все на сегодня. Жду вопросов и комментариев.

Оглавление

Введение
Инструментарий
Мобильность
Типы данных
Классы Java
Указатели
Массивы
Сборка мусора
Реализация классов

Библиотеки классов Java

НазадВперед

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

Обычно все профессиональные системы разработки приложений на языке программирования C++ содержат в своем составе набор стандартных библиотечных функций или библиотеки классов. В комплекте со всеми средствами разработки Java поставляются достаточно развитые библиотеки классов, значительно упрощающие программирование. В этом разделе мы кратко расскажем о составе и назначении библиотек классов Java.

Встроенные классы

В языке Java все классы происходят от класса Object, и, соответственно, наследуют методы этого класса. Некоторые библиотеки классов подключаются автоматически, и мы будем называть их встроенными. К таким относится, в частности, библиотека с названием java.lang. Другие библиотеки классов вы должны подключать в исходном тексте приложения Java явным образом с помощью оператора import.

Замещающие классы

Очень часто в наших приложениях вместо базовых типов переменных мы будем использовать объекты встроенных классов, которые называются замещающими классами (wrapper classes). Ниже мы перечислили названия этих классов и названия базовых типов данных, которые они замещают:

Базовый тип данных Замещающий класс
boolean Boolean
char Character
int Integer
long Long
float Float
double Double

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

Класс String

Класс String предназначен для работы с такими часто встречающимися объектами, как текстовые строки. Методы этого класса позволяют выполнять над строками практически все операции, которые вы делали раньше при помощи библиотечных функций C. Это преобразование строки в число и обратно с любым заданным основанием, определение длины строки, сравнение строк, извлечение подстроки и так далее.

Хотя в языке Java не допускается перезагрузка (переопределение) операторов, для объектов класса Stirng и объектов всех произошедших от него классов сделана встроенная перезагрузка операторов «+» и «+=». С помощью этих операторов можно выполнять слияние текстовых строк, например:

System.out.println(«x = » + x + ‘\n’);

Здесь в качестве параметра функции println передается текстовая строка, составленная из трех компонент: строки «x = «, числа x и символа перехода на следующую строку ‘\n’. Значение переменной x автоматически преобразуется в текстовую строку (что выполняется только для текстовых строк) и полученная таким образом текстовая строка сливается со строкой «x = «.

Другие встроенные классы

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

Предусмотрены также классы для выполнения запуска процессов и потоков, управления системой безопасности, а также для решения прочих системных задач.

Библиотека встроенных классов содержит очень важные классы для работы с исключениями. Эти классы нужны для обработки ошибочных ситуаций, которые могут возникнуть (и возникают!) при работе приложений или аплетов Java.

Подключаемые библиотеки классов

Ниже мы кратко перечислим подключаемые библиотеки классов для того чтобы вы могли оценить возможности набора классов Java. Подробное описание этих классов есть в справочной системе Java WorkShop и в различной литературе, посвященной Java. Мы же ограничимся описанием тех классов, которые будем использовать в наших примерах приложений.

Библиотека классов java.util

Библиотека классов java.util очень полезна при составлении приложений, потому что в ней имеются классы для создания таких структур, как динамические массивы, стеки и словари. Есть классы для работы с генератором псевдослучайных чисел, для разбора строк на составляющие элементы (токены), для работы с календарной датой и временем.

Библиотека классов java.io

В библиотеке классов java.io собраны классы, имеющие отношение к вводу и выводу данных через потоки. Заметим, что с использованием этих классов можно работать не только с потоками байт, но также и с потоками данных других типов, например числами int или текстовыми строками.

Библиотека классов java.net

Язык программирования Java разрабатывался в предположении, что им будут пользоваться для создания сетевых приложений. Поэтому было бы странно, если бы в составе среды разработки приложений Java не поставлялась библиотека классов для работы в сети. Библиотека классов java.net предназначена как раз для этого. Она содержит классы, с помощью которых можно работать с универсальными сетевыми адресами URL, передавать данные с использованием сокетов TCP и UDP, выполнять различные операции с адресами IP. Эта библиотека содержит также классы для выполнения преобразований двоичных данных в текстовый формат, что часто бывает необходимо.

В качестве примера приложения, составленного на языке программирования Java и ориентированного на работу в сети Internet, можно привести игру Java Color Lines (рис. 7).

Рис. 7. Сетевая игра Java Color Lines.

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

Это сетевая версия известной игры Lines, которая выполнена в виде нескольких аплетов, взаимодействующих между собой и между сервером Web, на котором они расположены. Так как список имен игроков и достигнутых ими результатов хранится на сервере, вы можете поучаствовать в мировом турнире, сразившись с игроками из разных стран.

Библиотека классов java.awt

Для создания пользовательского интерфейса аплеты Java могут и должны использовать библиотеку классов java.awt. AWT — это сокращение от Abstract Window Toolkit (инструментарий для работы с абстрактными окнами).

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

Библиотека классов java.awt.image

В среде любой операционной системы работа с графическими изображениями является достаточно сложной задачей. В операционной системе Windows для этого применяется графический интерфейс GDI.

Пишем элегантный и чистый Java код в 5 этапов

Если вы будете рисовать графические изображения в среде OS/2 или X-Windows, вам, очевидно, придется использовать другой программный интерфейс. Большую сложность также вызывает разбор заголовков графических файлов, так как они могут иметь различный формат и иногда содержат неправильную или противоречивую информацию.

Когда вы программируете на Java, рисование и обработка графических изображений выполняется намного проще, так как вам доступна специально предназначенная для этого библиотека классов java.awt.image. Помимо широкого разнообразия и удобства определенных в ней классов и методов, отметим способность этой библиотеки работать с графическими изображениями в формате GIF. Этот формат широко используется в Internet, так как он позволяет сжимать файлы графических изображений во много раз без потери качества за счет устранения избыточности.

Библиотека классов java.awt.peer

Библиотека классов java.awt.peer служит для подключения компонент AWT (например, кнопок, списков, полей редактирования текстовой информации, переключателей и так далее) к реализациям, зависящим от платформы, в процессе создания этих компонент.

Библиотека классов java.applet

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

НазадВперед

06 фев 2012 19:49  

java1cprog

Есть ли Java сообщество в Калининграде? Я хотел бы присоединиться. 🙂
07 фев 2012 02:30  

mesier

Хмм..

{!} JAVA примеры СПРАВОЧНИК (примеры кода online для начинающих — просто и понятно))

У меня встречный вопрос — а есть ли работа для java-программистов в Калининграде? 🙂
Если да, я бы может с удовольствием присоединился к сообществу!


"Знать может каждый дурак… Дело в том, чтобы понять." А. Эйнштейн.
07 фев 2012 06:54  

java1cprog

На замечательном сайте http://www.javatalks.ru такую информацию я рекомендую Вам поискать в разделе Работа для Java программистов. Работы — мне хватает, сообщества — нет.
Модераторы:Нет
Сейчас эту тему просматривают:Нет
javatalks — Форум Java программистовФорум Java программистовjavatalks.ru / 2006 — {current_year} © javatalks.ru551200true

javatalks.ru

GlassFish

Сервер приложений на Java EE с открытым исходным кодом, изначально разработанный Sun Microsystems. В настоящее время спонсируется корпорацией Oracle. Актуальная версия платформы называется Oracle GlassFish Server. В основу GlassFish легли …

подробнее…

JavaServer Faces

Фреймворк для веб-приложений, написанный на Java. Он служит для того, чтобы облегчать разработку пользовательских интерфейсов для Java EE приложений. В отличие от прочих MVC фреймворков, которые управляются запросами, подход JSF основывается на …

подробнее…

NetBeans

Интегрированная среда разработки приложений (IDE) на языках программирования Java и ряда других.

Введение в язык Java

Поддерживается и спонсируется Oracle, по качеству и возможностям последние версии NetBeans IDE не уступают лучшим платным средам разработки для …

подробнее…

JSTL и JSP

JSTL(JavaServer Pages Standard Tag Library) — переводится как «стандартная библиотека тегов JSP». Она расширяет спецификацию JSP. JSP (JavaServer Pages) — это технология, позволяющая web-разработчикам создавать статическое и динамическое содержимое web-страниц …

подробнее…

GitHub

Веб-сервис для хостинга проектов и их совместной разработки. Основан на системе контроля версий Git и разработан на Ruby on Rails и Erlang компанией GitHub, Inc разработчиками Крисом Ванстрасом, PJ Хиеттом и Томом Престон-Вернером. Сервис абсолютно бесплатен для …

подробнее…

Web-разработка на языке программирования Java — это данность сегодняшнего дня. Пока, основная масса приложений разработанных на Java это копроративные порталы и сайты банков. То есть те ресурсы, на который надо совместить безопасность с широкими функциональными возможностями. И связано это со многими причинами: высокий порог вхождения при осваивании Java, отсутствие услуг хостинга с поддержкой контейнера сервлетов или сервера приложений, нехватка и неполнота возможностей языка применительно к web-сайтам, отсутствие русскоязычной информации по данному вопросу.

Но время не стоит на месте и информационные технологии стремительно развиваются, совершенствуются и унифицируются. Языки программирования копируют друг у друга недостающие и востребованные аспекты, неумолимо двигаясь к формированию некоего «универсального языка» возможности которого будут покрывать все потребности разработчика.

Универсальность Java, с точки зрения разработки приложений и для настольных приложений, и для web-приложений — неоспорима. Активность IT индустрии в создании удобных сред разработки — на высоте. Ставка крупнейших производителей информационных продуктов на язык Java — стабильна. Значит, будущее, в котором использование Java при создании сайтов будет массовым явлением совсем не загорами! Хотя, хомяги (home-page) писать на Java вряд ли когда-нибудь будут.

Сделать сайт о web-разработке на Java именно с применением технологий Java — это актуально, по-этому JavaSource.ru:5050 работает на сервере GlassFish и использует фреймворк JSF — Java Server Faces, который является частью спецификации Java EE 6 и автоматически поддерживается всеми серверами приложений.

FILED UNDER : IT

Submit a Comment

Must be required * marked fields.

:*
:*