Заметьте, не все символы отображаются в Блокноте, вместо некоторых символов может вставляться какой-либо, ни о чём не говорящий, значок.Это так называемый "машинный код". Такие символы также имеют свой код в диапазоне от 0до 255. В Блокнотеони могут отображаться, например, в виде пустого прямоугольника.
Приступим к записи в файл. Перейдём к приложению, заходим в дизайнер (закладка Design визуального редактора).
Выполним автоматизацию при нажатии на кнопку "Записать". Создадим для нее обработчик событий (щелкнув по этой кнопки два раза) – метод actionPerformed().
Внутри этого метода, как и в предыдущих случаях, необходимо прописать программный код, выполняемый при нажатии на клавишу "Записать". Чтобы не писать этот код с нуля, возьмём фрагмент из обработчика при нажатии на клавишу "Удалить".
JOptionPane.showMessageDialog(null,"Файл не найден!","Ошибка",0);
}
}
Найдем строку, где создаётся кнопка JButton,buttonUdalit,и из обработчика события при нажатии на кнопку копируем данный фрагмент программного кода, и вставляем его в обработчик события при нажатии на кнопкуbtnZap, внутрь фигурный скобок:
btnZap.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Здесь должен находиться программный код
// при нажатии на кнопку
}
});
Первая строка вставленного фрагмента: получение содержимого текстового поля, остаётся неизменной. Проверка, этой строки на заполнение, и вывод сообщения, если строка не заполнена, также остаются без изменений.
Перед тем, как выполнить запись в файл, необходимо при помощи методаexistпроверить существование этого файла.
Если файл не существует,пользователю выводится сообщение: "Файл не найден!"–это так же останется без изменений, как при удалении файла.
Строки с удалением файла и с выводом сообщения, о том, что файл удалён, убираем. В этом месте будет записан программный код, выполняющий запись в файл. Получится следующее:
String str = textFieldFile.getText().trim();
if (str.isEmpty())
{
JOptionPane.showMessageDialog(null,"Введите путь к файлу!","Ошибка",0);
}
else
{
File nf = new File(str);
if (nf.exists())
{
// Здесь будет находиться программный код для записи в файл
}
else
{
JOptionPane.showMessageDialog(null, "Файл не найден!","Ошибка",0);
}
}
Приступим к написанию программного кода для записи в файл. Для выполнения записи в файл, воспользуемся следующей схемой. Запись в файл, так же, как и чтение из файла, осуществляется при помощи так называемых потоков. Поток–виртуальный поток символов, попадающий в файл при записи, и извлекаемый из файла при его считывании.Добавим фрагмент программного кода,выполняющий запись в файл:
JOptionPane.showMessageDialog(null,"Файл не найден!","Ошибка",0);
}
}
}});
Этот пример программного кода можно будет использовать в качестве рецепта разработки. Поместите его в свой сборник рецептов, добавьте комментарий о сути работы этого фрагмента и, при необходимости, используйте в дальнейшем.
Информацию о том, как это можно было сделать, можно получить из литературы по языку Java, а также найти в Интернете.
Операции ввода-вывода, в данном случае запись, осуществляются при помощи конструкции try-catch, поэтому фрагмент кода для записи вложен внутрь конструкцииtry-catch. Первое,что создано в этом фрагменте - переменная типа OutputStream (Stream (с англ. поток), Output– (с англ. из,вовне):
OutputStream obj = new FileOutputStream(str);
В нашем случае он идет из приложения в файл на диске. Имя переменной может быть любым. Указано имя objи создан новый объект под названием FileOutputStream.
В круглых скобках указана переменная str, в этой переменной находится путь к файлу, получаемый из текстового поля.Переменная objпосле этой операции станет привязанной к файлу по указанному пути.
try–попытка (в данном случае, попытка сделать запись в файл).
catch –исключение,обработка исключительной ситуации, если,попытка записи в файл будет неуспешной (файл не был найден на диске и т. д.).
После создания переменной типа OutputStreamсоздаём переменную out с типом типом BufferedWriter (Writerс англ. –запись):
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(obj));
В этом случае будет производиться запись в файл. Дальше создаётся объект BufferedWriter. В круглых скобках создаётся объект типа OutputStreamWriter.При создании объекта OutputStreamWriterв круглых скобках нужно указать переменную типа OutputStream. В нашем случае это переменная под названием obj. Далее следует запись в файл.
out.write(textArea.getText());
Для выполнения этой операции идёт обращение к переменнойoutи вызывается метод под названием write. Метод writeвыполняет запись в файл. С помощью этого метода записывается текст, который будет находиться в многострочном текстовом поле textArea. Обращаемся к нашему полю, и через оператор "точка" (.)., вызываем методgetText (получить текст, находящийся в этом многострочном поле).
После выполнения записи в файл, необходимо завершить действие, т. е.выполнить закрытие операций BufferedWriterи OutputStream. Если этого не сделать, в некоторых случаях может получиться некорректная запись в файл.
Запустим приложение и проверим, всё ли работает правильно.Создадим новый тестовый файл в корне дискаC:\, назвав егоtest.txt.
В многострочное поле в нашем приложении запишем какой-либо текст,допустим, произвольные цифры. Нажмем на кнопку "Записать". Появилось сообщение: "Запись выполнена!!!"(см. рис. 10.7):
Рис. 10.7
Найдём этот файл.Перейдем в корень диска C:\, находим файл test.txt, открываем его вБлокноте.Записанные цифры появились в файле (см. рис. 10.8) и откроем его. Текст действительно записан в фацл.
Рис. 10.8
Осуществим теперь чтение из файла и вывод считанной информации в окно приложения. Прежде чем приступать к чтению, запустим приложение.
Файл test.txtуже существует в корне диска C:\,укажем путь к нему.
Введём в многострочное текстовое поле цифру 1, нажмем на кнопку "Записать"нашего приложения –запись выполнена. Переходим на диск C:\, открываем файл. В нём действительно находится цифра 1. Посмотрим размер файла: нажимаем правую клавишу, выбираемСвойства.Размер файла –1 байт.
Далее возвращаемся в окно и после единицы делаем перевод строки: нажимаем клавишу Enter, и курсор попадает на следующую строку. Снова нажимаем кнопку"Записать",запись выполнена.
Переходим на дискC:\,посмотрим размер файла. Теперь файл занимает уже 2байта. Добавился перевод строки, и размер файла стал больше.
Теперь перейдём в дизайнер (закладка Designвизуального редактора) и автоматизируем кнопку "Прочитать", которая позволит нам выполнить чтение из файла при нажатии на эту кнопку.
Создадим обработчик события этой кнопки –actionPerformed.
При записи в файл, можно использовать готовый фрагмент программного кода кнопки "Записать".
Полностью копируем этот фрагмент программного кода и вставляем его в обработчик события кнопки "Прочитать".
Как и при автоматизации предыдущей кнопки, путь к файлу считывается из текстового поля, далее осуществляется проверка, что путь действительно введён. Если путь не введён,выводится сообщение об ошибке.
Следующая проверка– на существование этого файла. Если файла нет,пользователю выводится сообщение, что файл не найден.
Если файл найден,выполняется операция по считыванию данных из файла.
Операция чтения так же,как и операция записи, записывается внутри конструкции try-catch, поэтому ее мы оставляем, а вот сам фрагмент с записью внутри, блок try, удаляем. Получилось следующее:
JOptionPane.showMessageDialog(null, "Файл не найден!","Ошибка",0);
}
}
}});
Для чтения в блок tryнеобходимо поместить следующий программный код:
InputStream obj = new FileInputStream(str);
BufferedReader in =
new BufferedReader(new InputStreamReader(obj));
String tmp = "";
while(in.ready())
{
tmp += (in.readLine()+"\n");
}
textArea.setText(tmp);
in.close();
obj.close();
Чтение осуществляется принципу, противоположному записи.Создаётся переменная InputStream (можно назвать её так же, как и в предыдущем случае –obj):
InputStream obj = new FileInputStream(str);
Если при записи переменная была типа OutputStream (поток вовне),при чтении будем использовать InputStream–поток направлен внутрь. Теперь данные поступают в приложение из файла. Создаётся новый объект FileInputStream,в круглых скобках указывается путь к файлу, находящийся в переменной str.
Далее создаётся переменная для чтения, BufferedReader. Она получила название in (имя переменной может быть и другим).
BufferedReader in = new BufferedReader(new InputStreamReader(obj));
Создаётся новый объект BufferedReader,в круглых скобках при создании объекта создаём новый объект InputStreamReader. Во внутренних круглых скобках указывается имя переменной obj (переменной типа InputStream, объявленной в предыдущей строке).
Считывание данных из файла –процесс, противоположный записи в файл. При создании переменных тип меняется с Writerна Reader, а поток –с Outputна Input. Это и есть основные отличия программного кода чтения от программного кода записи. После выполнения чтения из файла, также, как и при записи,выполняется закрытие файла.
in.close();
obj.close();
Перед закрытием находится фрагмент кода, который и производит само считывание из файла.
String tmp = "";
while(in.ready())
{
tmp += (in.readLine()+"\n");
}
textArea.setText(tmp);
Предположим, есть некоторый файл, содержимое которого будем считывать построчно, т. е. за один заход считаем одну строку (все символы до перевода строки). Считывание осуществим в цикле while.Условие работы цикла whileследующее:
Обратимся к переменнойinи вызываем метод ready(). Этот метод возвращает булево значение: либо истину,либо ложь.
while(in.ready())
При чтении из файла с помощью метода ready()определяется, что следующее считывание возможно: при считывании строк конец файла ещё не достигнут –файл читаем. Как только считается последняя строка, метод readyвернёт значениеложь. Значит,файл закончился, и чтение нужно прекращать.Перед циклом whileсоздадим переменную под названием tmp, типа String (строка), и присвоим ей начальное значение пустая строка.
String tmp = "";
Внутри цикла whileочередную считываемую строку будем прибавлять в конец данной строки.
tmp += (in.readLine()+"\n");
Изначально строка пустая, но с каждой последующей считываемой строкой она становится больше,т. к. в её конец добавляется очередная считываемая строка. tmp +=, означает, что к текущей строке добавляется новый фрагмент в виде считываемой строки.
Для считывания очередной строки необходимо обратиться к переменной inи вызывать метод readLine.
Метод readLineсчитывает одну строку из файла, т. е. набор символов до следующего перевода строки. После выполнения этого метода мы получаем очередную порцию считанных символов и к этой порции добавляем перевод строки–"\n". Символ "наклонная черта" \называется специальным символом. Если после такого специального символа идет буква n, это значит, что будет вставлен перевод строки. В нашем случае фрагмент "\n"обеспечивает построчное отображение текста в таком же виде, как и внутри файла.
После того, как отработает цикл while, он в переменную tmpбудет помещена вся строка, находящуюся внутри файла, т. е., весь файл будет построчно считан и помещён в эту строку. Между каждой строкой будет вставлен перевод строки, чтобы при отображении надпись выводилась построчно.
Остаётся вывести значение переменной tmpв многострочное текстовое поле.
textArea.setText(tmp);
Обращаемся к многострочному текстовому полю textAreaи вызываем методsetText. (с англ. set–установить,Text–текст). Этот метод позволяет вывести данные в многострочное поле. В круглых скобках указываем переменную под названием tmp, и, таким образом,выводим её содержимое на экран.Сохраним приложение, запустим его на выполнение.
Указываем созданный файл на диске C:\,test.txt, вводим в него несколько строк какого-либо текста,выполняем операцию записи. Запись выполнена. Удалим текст из многострочного текстового поля, и произведём чтение. Если чтение выполняется правильно, на экране вновь появится содержимое файла.
Перед выполнением операции чтения перейдём в корень дискаC:\.
Откроем этот файл,убедимся в том, что он действительно содержит введённые строки и что между ними находятся переводы строки.
Вернёмся в приложение,нажмём на кнопку "Прочитать".
Текст, записанный в файл, в том же виде отобразился в приложении, чтение осуществляется правильно.
Занятие 11. "Базы данных.Язык запросов SQL. Работа с базой данных MySQLиз Java"
На этом занятии вы узнаете, что такое база данных, где она используется, и как работать с базой данных на языке программирования Java.
Сегодня сложно представить разработку крупных приложений, как для интернета, так и для настольных компьютеров без использования базы данных. Практически все современные сайты построены на базах данных. Многие системы, которые пишутся, например, под операционную систему Windows, также очень часто используют базы данных.
База данных–оптимально организованное хранилище совокупности данных, физически находящееся в одном или нескольких файлах.
К совокупности данных прилагается удобный сервис для работы с ними: получения, изменения, удаления данных и т.д. Он называется системой управления базами данных.
Cистема управления базами данных (СУБД)–программное обеспечение, организующее работу с базами данных.
Существует много различных решений – различных систем управления базами данных.
Можно ли обойтись без СУБД и для хранения данных приложения воспользоваться обычными файлами – сохранять в файлах данные, затем, в приложении, эти файлы открывать, извлекать из них информацию?Можно, но при большом количестве данных,при сложной структуре их взаимосвязей через файлы, эта работа будет очень трудоёмкой.
Кроме того, можно столкнуться с проблемой, когда большое количество пользователей одновременно пытается получить доступ к одному файлу.
Простой пример – web-сайт в интернете:
Допустим, одновременное количество пользователей зашло на этот сайт, скажем, десять тысяч человек. Если данные из одного файла попытается получить или изменить большое количество пользователей одновременно, произойдет разрушение данных. Если сразу несколько пользователей начнут записывать и считывать файл, данные в нём станут некорректными.
Значит, для правильной организации работы пока один пользователь считывает файл, нужно блокировать его для других пользователей. Тогда каждый следующий пользователь получит доступ к файлу только после того, как с ним закончит работу предыдущий. Если пользователей много, выстроится очередь ожидающих своей работы с этим файлом. Скорость работы значительно упадёт.
Намного правильнее в таких случаях воспользоваться готовым специализированным решением: системой управления базы данных (СУБД).
Система управления базами данных используется как для разработки под операционную систему, так и для интернета. Принцип работы одинаков,поэтому достаточно разобраться, например,как использовать базу данных при разработке приложения для операционной системы Windows. В таком же качестве можно использовать базу данных при создании web-сайта и т. д.
Итак, основное понятие – СУБД (система управления базами данных) (см.рис. 11.1).
Рис. 11.1
База данных, как мы уже знаем, – это файл или группа связанных файлов (в зависимости от типа базы данных).
СУБД – оболочка,предоставляющая сервис для удобной и быстрой работы с базой данных.
Рассмотрим некоторые популярные решения СУБД на сегодняшний день. (см. рис. 11.2).
Рис. 11.2
· Приложение –Access.
Accessпредназначен как для домашних пользователей, так и для малого бизнеса.Это решение компании Microsoft. Оно имеет некоторые ограничения. Если количество пользователей, одновременно работающих с базой данных, довольно велико, нужно пользоваться более мощным решением.
Следующая группа –бесплатные СУБД.
· СУБД MySQL(одна из самых популярных на сегодняшний день, очень часто используется при web-разработке).
· СУБД –PostgreSQL.
Указанные СУБД можно скачать из интернета, установить и пользоваться ими бесплатно. Это довольно мощные решения, их вполне достаточно для реализации многих крупных проектов.
Третья группа – платные СУБД:
· Oracle Database
· Microsoft SQL Server
У них есть, и бесплатные экспресс варианты, но их функционал существенно ограничен.
Мы будем работать с СУБДMySQL. Эту СУБД можно использовать и для разработки под Windows, и для web-разработки. Если вы хотите заниматься разработкой web-сайтов, или уже занимаетесь, вероятнее всего, вы обратитесь именно к MySQL.
Для работы с данными,хранящимися в базе данных, мы будем использовать, так называемый, язык структурированных запросов SQL.
Язык структурированных запросов SQLпозволяет получать данные из базы данных по определенным условиям, изменять, удалять эти данные и добавлять новые.
Сегодня мы рассмотрим несколько SQLзапросов, позволяющих выполнять основные операции над данными.
Но сначала подробно рассмотрим, что собой представляет база данных, какова её структура и каковы основные теоретические понятия.
Существуют две разновидности базы данных: реляционная и нереляционная модель.
Реляционные базы данных–это базы данных,построенные на таблицах.
Мы будем рассматривать реляционную модель, как правило,используемую на сегодняшний день. Все перечисленные выше СУБД являются реляционными базами данных (см. рис. 11.2).
Рис. 11.3
Если вы работали с приложением Excel,вы часто встречали таблицы, заполненные данными. Каждая таблица имеет определенное количество колонок и строк.
Создадим простую таблицу, содержащую данные: имя и фамилия. Также добавим колонку под названием idдля возможности задавать номера каждой записи.Приблизительно в таком же виде данные хранятся и в базе данных.
Итак, реляционная база данных – это база, в которой содержится определенное количество таблиц. Таблицы, конечно, могут быть по структуре значительно сложнее примера, приведённого выше, их может быть много, и эти таблицы могут быть, так или иначе, взаимосвязаны между собой.
Начнём с простых таблиц и постепенно будем двигаться к сложным.
Каждая таблица имеет колонку. Колонка называется полем, или ключом.
Поле, илиключ–колонка таблицы.
В нашей таблице три поля: id, имя и фамилия. Каждое поле имеет свой тип данных. Этот тип данных напоминает тип данных, используемый при объявлении переменных. Первое поле idимеет тип данныхчисло: 1, 2, 3 и т.д., а колонки (поля) имя и фамилия, имеют тип данных строка, так как представляют собой строковые записи. Эти типы данных напоминают тип intи типStringизязыкаJava.
Следующее важное понятие при работе с таблицами–строка таблицы.Строка таблицы называется записью.
Первое действие при формировании таблицы: создание полей(колонок). После этого в таблицу добавляются строки (записи). В нашем случае каждая строка имеет свой уникальный номер:1, 2, 3и т. д. По этому номеру можно однозначно идентифицировать строку. Первичный ключ–поле или несколько полей, однозначно идентифицирующие любую запись в таблице.
Это важное понятие, его нужно запомнить.
В нашем случае первичным ключом является поле id. Если первая строка имеет номер 1, в таблице больше нет строк, имеющих тот же номер. Таким образом, это поле однозначно идентифицирует каждую запись. Другими словами это значение уникально.
Работа с табличными базами данных осуществляется, как говорилось выше, при помощи языка запросовSQL. Для того,чтобы выполнить необходимые манипуляции с данными, мы будем использовать четыре основные команды: SELECT, INSERT,DELETE, UPDATE(см.рис. 11.4).
Рис. 11.4
Команда SELECTпозволяет выбрать данные.
Например, если имеется таблица, хранящая имя, фамилию, год рождения, при помощи команды SELECTможно выбрать всех людей, родившихся в пределах от 1960 по 1970год.
При помощи командыINSERTможно добавить в таблицу новые строки. При помощи команды DELETEможно удалить строки, соответствующие определенному условию.
И, наконец, при помощи команды UPDATEможно изменять значения в таблице.
Этих четырёх команд достаточно, чтобы производить основные манипуляции с базой данных: заполнять таблицу данными, извлекать их, изменять и удалять.
Чтобы начать работать с СУБД MySQL,необходимо её установить. Воспользуемся,так называемым, пакетом Denwer.
Пакет Denwerудобен: его установка производится легко и быстро, не требует сложных настроек. Скачать этот пакет можно на сайте www.denwer.ru
Переходим на сайт и выбираем "Скачать Denwer"(см. рис. 11.5).
Рис. 11.5
Появляется вопрос, какая версия PHP нужна?Оставляем предлагаемую по умолчанию,нажимаем кнопку "Скачать"(см. рис. 11.6).
Рис. 11.6
Предлагается ввести имя,фамилию, e-mail для того, чтобы получить ссылку на скачивание (см. рис.11.7).
Рис. 11.7
Вводим данные, указываем адрес электронной почты, переходим ниже и нажимаем "Получитьссылку на скачивание(см.рис. 11.8).
Рис. 11.8
Появляется сообщение:ссылка на скачивание отправлена на почту.Открываем свой почтовый ящик и находим письмо с сайта Denwer. В письме указана ссылка, по которой предлагается перейти (см.рис. 11.9).
Рис. 11.9
Переходим по ссылке и производим скачивание. В самом верху появляется сообщение, на какую ссылку нужно нажать, если загрузка не происходит.Далее появляется окно с возможностью сохранения файла (см. рис.11.10).
Рис. 11.10
Сохраняем его к себе на компьютер, открываем папку и, прежде чем запускать установку Denwer, закроем браузер.
Прежде, чем запускать установку Denwer,необходимо отключить такие программы какSkype,TeamViewer.
Если в данный момент запущен web-сервер Internet Information Servicesдля операционной системы Windows,его также нужно отключить. Это делается,поскольку Denwer и все эти вышеперечисленные программы используют, так называемый, 80-й порт. Если не отключить другие программы, они начнут конфликтовать, и, скорее всего, успешно запустить Denwerне получится.
Начнём установку пакета(см. рис. 11.11).
Рис. 11.11
Щёлкнем дважды мышкой.На экране появляется вопрос: