Закрываем это окно,возвращаемся в программный код и разбираем его дальше.
У конструкции ifможет быть продолжение под названием else (иначе). Инструкции,помещенные в этот блок срабатывают, если значение условия равно "Ложь" (в нашем случае такое значение говорит о том, что строка не пуста). Пусть в этом случае (когда пользователь что-то ввёл), выводится сообщение: "Привет! " +имя пользователя.
Для вывода этого сообщения также будем использовать диалоговое окно JOptionPane, поэтому копируем уже созданную строку, вставляем её в конструкцию Иначе, и здесь, в сообщении пишем другой текст: "Привет!", и прибавляем имя, введённое пользователем (+ str).
Мы соединили две строки: "Привет" и строку, содержащуюся в переменной str.Эта операция называется сложением (склеиванием) строкили конкатенациейи обозначается знаком "+" (плюс). После применения этой операции получается одна общая строка.
Запустим программу на исполнение.
Запуск можно делать как с закладки Design,так и из программного кода. Если пользователь ничего не ввёл, или ввёл лишь несколько пробелов, появляется диалоговое окно "Введите имя!"
Иначе (если пользователь ввёл имя "Вася"и нажал кнопку "Вход"), появляется диалоговое окно с надписью: "Привет! Вася". (см. рис. 8.47)
Рис. 8.47
Итак, мы написали приложение, используя визуальный редактор.Такое же приложение можно было бы написать и без визуального редактора, как мы делали ранее, но пришлось бы вручную прописывать фрагменты программного кода, добавляющие элементы на форму, вручную указывать отступы сверху и слева, ширину и высоту в пикселях. Эта кропотливая работа с размерами, прикреплением элементов к панели и т. д. требует много времени и не очень интересна разработчику.
Намного удобнее создать элементы в визуальном редакторе и использовать их, лишь немного корректируя.Но, для эффективной и грамотной работы,нужно иметь хорошие навыки программной работы с элементами, нужно четко представлять, как элементы располагаются на форме, и в случае необходимости,поменять те или иные значения вручную в программном коде, который создает среда разработки автоматически.
Занятие 9. "Работа с файловой системой из Java. Создание,удаление, переименование файлов"
На этом занятии мы начнём изучение основных принципов работы с файловой системой, обсудим основные закономерности структурного устройства файловой системы.
Откроем Мой компьютер, диск С:. В корне диска С:\находится список папок и директорий. Создадим новый файл –текстовый документ(см. рис. 9.1).
Рис. 9.1
Файл не содержит информации, он пустой и представляет собой наименование, в данном случае, текстовый документ с расширением .txt. Расширение .txtозначает, что это текстовый файл.
Существует несколько основных моментов, важных при работе с файловой системой:
· Данные на диске или на внешних носителях хранятся в виде файлов.
· Каждый файл имеет название. Название делится на две составляющие: имя файла и его расширение, оно указывается после точки. Расширения служат для определения типа (формата) файла. В некоторых случаях расширение файла может отсутствовать.
· У каждого файла есть адрес (путь к нему).
Ниже приведены два примера, в них указан путь к некоторому файлу (см. рис. 9.2).
Рис. 9.2
Рассмотрим, как формируется путь к файлу.
В первом случае файл находится на диске С:в папке Windows, имеет имя regedit.exe. Таким образом,основные составляющие пути к файлу следующие:
· Наименование диска. Указывается диск и ставится двоеточие –С:.Этодиск,на котором физически находится файл. Диск может быть и внешним, например, флэш-карта.
· Названия папок, содержащих этот файл. Папки отделяются наклонной чертой"\". В данном случае путь к файлу записывается так:С:\Windows\regedit.exe.После наименования каждой папки(директории), устанавливается наклонная черта. Если вложенных папок много, они последовательно указываются через наклонную черту.
· Название самого файла, в нашем случае это regedit.exe.
Таким образом, структура папок представляет собой древовидную схему: в каждую папку могут быть вложены другие папки (директории), внутри них также могут находиться папки, и т. д. В этих папках содержится множество файлов или один файл.
Файлы можно создавать,переименовать или удалять. Подобные операции можно производить и программно, с помощью языка программирования Java.
Для работы с файлами вJava-приложенияхсуществует специально предназначенный класс под названием File. Для работы с этим классом подключается специальная библиотека при помощи команды import:
import java.io.*;
Все классы, находящиеся внутри библиотеки .io, станут доступны, т.к. символ "*" (звёздочка) означает возможность использования всех классов, находящихся в указанной библиотеке. Подключив к проекту эту библиотеку, можно начать работать с файлами. Рассмотрим основные методы работы с файлами в Java.
· Метод createNewFile() применяется, если требуется создать новый файл. При помощи этого метода можно создать на диске новый файл по указанному адресу.
· Метод exists()предназначен для программной проверки существования файла.Этот метод определяет, есть такой файл на диске или нет.
· Метод renameTo()позволяет переименовать файл, т. е. задать ему какое-то другое имя.
· Метод delete()позволяет удалить файл с диска.
· Метод getParent() позволяет получить путь к файлу(с англ get – получить, Parent – родитель, дословно –получить родителя, получить путь к файлу –список вложенных папок, содержащих данный файл).
Эти методы нам сейчас и понадобятся. Перейдём в среду разработкиEclipseи создадим новый проект Java,назвав его lesson_21.
На прошлом занятии мы познакомились с визуальным редактором для разработки интерфейса. С помощью этого редактора создадим интерфейс нашего нового приложения.
Для этого выделим в списке новый проект lesson_21, в контекстном меню выберем команду Создать- Прочие(см. рис.9. 3):
Рис. 9.3
Далее выбираем закладкуWindowBuilder, а в ней закладку –Swing Designer (см. рис. 9.4):
Рис. 9.4
Затем JFrame–добавляем новую форму (см. рис. 9.5):
Рис. 9.5
Эта форма будет единственной в проекте. Нажимаем кнопку"Далее",указываем название формы: prog(см.рис. 9.6), нажимаем кнопку"Готово".
Рис. 9.6
Появляется начальная заготовка программы, уже содержащая некоторый программный код. Также есть закладка дизайнера, позволяющая посмотреть созданное окно в визуальном конструкторе. Запустим приложение на исполнение –нам предоставляется начальная заготовка,содержащая в себе готовое окно определённых размеров. Можно приступить к дополнению нужных элементов внутри этого окна.
Нажмём левой клавишей мыши на заголовок окна (верхняя полоса, где находится иконка Java, иконка чашечки кофе). Зададим заголовок окна –"Операции для работы с файлами". Для этого нужно перейти к панели, где указываются свойства. Свойство title – это заголовок окна(см. рис. 9.7):
Рис. 9.7
В верхней части окна появилось указанное название заголовка окна (см. рис. 9.8):
Рис. 9.8
Поменяем иконку окна.Найдём свойство iconImage, нажмём кнопку и перейдём к выбору иконок (см. рис.9.9):
Рис. 9.9
Если установить переключатель в самое верхнее положение,можно выбрать иконки, данные по умолчанию.Переходим к списку параметров, открываем предоставленный список. Из указанных иконок произвольно выберем любую,например, Inform.gif(см. рис. 9.10).Нажимаем кнопку "OK" – иконка изменилась.
Рис. 9.10
Щёлкнем левой клавишей мыши в панель окна. Обратите внимание,после выполнения этой операции панель,вложенная в окно, выделяется чёрной рамкой с квадратиками (см.рис. 9.11):
Рис. 9.11
После выделения определенного элемента на форме, свойства,отображаемые слева, это свойства выделенного, текущего элемента формы. В свойствах Layoutнужно указать самое верхнее значениеAbsolute layout (см. рис. 9.12).
Рис. 9.12
Это даёт возможность произвольного размещения контролов- элементов формы.
Если этого не сделать,элементы формы начнут компоноваться относительно друг друга, т. е. появится некий каркас. Поэтому мы отключаем это свойство и включаем возможность произвольного размещения.
Далее, на основании знаний, полученных из предыдущего занятия построим интерфейс, изображенный на рис. 9.13:
Рис. 9.13
Для создания такого интерфейса нам необходимо добавить:
· одну текстовую надпись JLabel, содержащую текст: "Укажите путь к файлу:"
· текстовое поле JTextField, котороебудет находиться справа от надписи.
· многострочное текстовое поле JTextArea, которое будет располагаться справа от кнопок.
После добавления на форму – все эти элементы необходимо сделать нужных размеров и выровнять как на рис. 9.13. Этот интерфейс должен отобразиться после запуска приложения.
Приступим к созданию элементов. Напомним, текстовые надписи можно задать при помощи свойства text(см.рис. 9.14):
Рис. 9.14
Далее необходимо указать значение свойства Variableдля элементов формы. Напомним, что это значение –имя переменной, по которому можно будет обратиться к элементу из программного кода (см. рис.9.15):
Рис. 9.15
Для текстового поляJTextFieldукажем имя – textFieldFile.
Для кнопки "Создать новый"– buttonNoviy.
Для кнопки "Удалить"– buttonUdalit
Для кнопки "Переименовать"– buttonPereim.
Для кнопки "Записать"– buttonProch,
Для кнопки "Прочитать"–buttonZap.
Для многострочного текстового поля JTextArea– textArea.
Имена переменных могут быть и другими, вы можете задать их по своему усмотрению. Но желательно их задавать как и в этих примерах: сначала идет название элемента формы (напримерbutton–ясно,что это кнопка),а затем (сокращенно) за что этот элемент отвечает (например, Pereim–переименовать).
В реализации интерфейса осталось сделать последнее: добавить полосы прокрутки к многострочному текстовому полю JTextArea(см. рис. 9.16).
Рис. 9.16
Эти полосы полезны,когда текст, введенный в поле, не будет помещаться по высоте или ширине - тогда автоматически появятся полосы прокрутки.Для добавления полос прокрутки нужно выделить многострочное текстовое полеJTextArea, нажать на него левой клавишей мыши–по границам появятся черные квадратики (см. рис. 9.17):
Рис. 9.17
Далее справа в верхнем окне выбираем это поле (см.рис.9. 18)
Рис. 9.18
Нажмем правую клавишу мыши, откроется окно (см. рис.9.19)
Рис. 9.19
В этом окне выбираем команду Surround with– javax.swing.JScrollPane(см. рис. 9.19).После выполнения этой операции многострочное текстовое поле будет вложено в горизонтальные и вертикальные полосы прокрутки.
Для проверки можно запустить приложение и ввести в это поле текст, который не будет помещаться по высоте или ширине –появятся полосы прокрутки, как показано на рис. 9.16. На этом создание интерфейса нашего приложения закончено, и можно приступить к добавлению программного кода.
Перейдём на нижнюю закладку с программным кодом. Все добавления в визуальном редакторе автоматически были прописаны в программном коде. Программный код и визуальный редактор полностью синхронизированы. Если в программном коде добавить какой-либо блок, он появится и в визуальном редакторе.
Рассмотрим два поля:однострочное текстовое поле и многострочное текстовое поле.
Обратите внимание, полеtextFieldFile – однострочное текстовое поле. Его тип JTextField – визуальная среда поместила в переменные класса, т. е.объявила как переменную класса. Значит,переменная textFieldFileдоступна в любом методе класса– в любой точке класса она будет видна и доступна.
public class prog extends JFrame
{
private JPanel contentPane;
private JTextField textFieldFile;
Поле textAreaимеет тип переменной JTextArea, объявленный визуальной средой разработки внутри конструктора класса.
JTextArea textArea = new JTextArea();
scrollPane.setViewportView(textArea);
}
}
Переменная существует,т.е. видна до закрывающей фигурной скобки конструктора класса. Если она объявлена внутри конструктора класса –за пределами конструктора класса она уже не существует.
Нам нужно объявить переменную JTextAreaв переменных класса, чтобы она была доступна в любой точке класса (иначе из программного кода к ней можно будет обратиться только внутри конструктора класса).
public class prog extends JFrame
{
private JPanel contentPane;
private JTextField textFieldFile;
private JTextArea textArea;
Конструктор класса имеет название, как и имя класса, prog.
Переходим в самую нижнюю часть, где объявлена эта переменная,изменяем объявление переменной в констукторе (строка, которую нужно удалить,выделена жирным шрифтом):
textArea = new JTextArea();
scrollPane.setViewportView(textArea);
}
}
В строке, где создается объект JTextAreaудалено указание типа переменной, эту переменную мы объявили как переменную класса, а в конструкторе просто обращаемся к ней.
Если бы мы оставили тип переменной, это была бы уже другая переменная. В данном же случае мы имеем переменную, объявленную в самой верхней части класса. Указан её тип, имя. А ниже уже создаётся объект, привязанный к этой переменной.
Теперь визуальная часть полностью готова. Начинаем добавлять основной программный код.
Автоматизируем кнопку создания нового файла. Перейдём в визуальный конструктор.
Выделив кнопку "Создать новый",двойным щелчком левой клавишей мыши перейдем в обработчик события, который будет создан по умолчанию.
Двойной щелчок на элементе формы автоматически создаёт обработчик события, наиболее часто происходящего с этим элементом формы. Для кнопки основное событие –нажатие на кнопку,событие типа actionPerformed(). Всё, прописанное внутри методаactionPerformed(), будет выполняться после нажатия на эту кнопку.Добавим программный код в обработчик события, код которого написан ниже:
В этом обработчике будет объявлена переменная под названиемstr, типа String, строка. В эту переменную запишется содержимое текстового поля, находящегося в самой верхней части программного кода.
String str = textFieldFile.getText().trim();
Выберем переменнуюtextFieldFile–нужное нам текстовое поле.
Обратимся к этому текстовому полю, нажимаем и при помощи метода getText()(который мы выберем после оператора точка (.)) получим содержимое этого поля, т. е.текста, который будет там написан.
Далее оператором точка(.) вызовем ещё один метод под названием trim().Метод trim()срезает пробелы справа и слева, т. е.удаляет ненужные пробелы, если пользователь случайно их ввёл.
Создаём конструкциюif. Выбираемstr, через оператор точка (.) вызовем метод isEmpty().Метод isEmpty()– это проверка факта пустой строки. Если методisEmpty() возвращает значение "истина", значит,строка пустая, пользователь не указал ничего в имени файла. В этом случае для него нужно вывести предупреждающее сообщение.
Открываем и закрываем фигурные скобки, при помощи класса JOptionPaneвызываем методshowMessageDialog(). В скобках этого метода укажем 4 параметра. Первый параметрnull – родительское окно, ему принадлежит данное диалоговое окно. В нашем случае родительское окно само по себе, поэтому первый параметр null – пустой параметр. Следующим параметром указываем текстовое сообщение для пользователя: "Введите путь к файлу!".Третьим параметром укажем заголовок окна –Ошибка. Переменные типа String указываются в двойных кавычках.Сообщение для пользователя и заголовок окна – переменные типа String, строковые переменные. И последний,четвертый параметр 0 – тип иконки, выводимой в окне пользователя.
OptionPane.showMessageDialog(null,
"Введите путь к файлу!","Ошибка",0);
Записав эту часть программного кода, запустим приложение на исполнение. Появилось окно, его верхнее поле пустое. Нажимаем на кнопку "Создать новый"–появляется диалоговое окно с текстом"Введите путь к файлу!". В заголовке окна указывается то название, которое нами было задано –"Ошибка" и значок . Это иконка с числовым кодом 0.(см. рис. 9.20).
Рис. 9.20
Закрываем окно и вновь переходим к написанию программного кода.Записываем блок else (иначе). Нам нужно описать ситуацию,которая возникнет, если пользователь ввёл какой-то текст. Создадим открывающую и закрывающую фигурные скобки. Внутри фигурных скобок elseсоздаём переменную nfтипа Fileиновый объект new File(str). Внутри круглых скобок помещаем введённое пользователем значение переменной str:
nf = new File(str);
При помощи переменной типа Fileможно производить некоторые операции с файлами,такие как удаление или переименование файлов. В круглых скобках указывается путь к файлу. Подчёркивание красным цветом говорит о том, что в самой верхней части,где происходит добавление библиотек, не добавлена библиотека для работы с классомFile, о которой говорилось в самом начале. Добавим эту библиотеку:
import java.io.*;
Снова возвращаемся к программному коду, подчеркивание красным цветом исчезло. Создадим конструкциюtry ... catch (попытка… исключение). Эта конструкция используется, если при выполнении некоторых операций, может возникнуть исключительная ситуация –невозможность исполнения команд. В нашем случае, если пользователь укажет неверный адрес файла,программа не сможет создать этот файл.
В таком случае операции по созданию файла можно поместить в конструкцию try ... catch. После ключевого слова tryпропишем попытку создания файла.
Обратимся к переменнойnf, связанной с тем файлом, путь к которому был указан, и вызываем метод createNewFile() – создать новый файл.
После создания файла выведем пользователю сообщение в диалоговос окне об успешном создании файла: "Файл создан!".Для этого воспользуемся классом JOptionPaneи методом showMessageDialog(). В диалоговом окне выведем сообщение пользователю: Зададим заголовок окна: "Сообщение". Тип иконки укажем 1 ( - обычная информационная иконка).
JOptionPane.showMessageDialog(null, "Файл не создан!","Ошибка",0);
}
Команды, которые должны сработать в случае, если у программы не получится создать файл, записываются после ключевого слова catch.В круглых скобках создаётся переменная типа IOException – исключительная ситуация ввода-вывода.
У конструкции catchтакже есть свои фигурные скобки, выделяющие блок,выполняемый в случае неуспешной попытки.Мы в случае не удачной попытки создания файла выведем сообщение в диалоговом окне:"Файл не создан!".Для этого вновь воспользуемся классом JOptionPaneи методом showMessageDialog(). Зададим заголовок окна – "Ошибка".Добавим иконку с типом 0 (уже знакомый нам "красный крестик").
Запустим приложение на исполнение. Конструкция try ... catchбудет работать так:сначала выполняется блок try – попытка. Если попытка успешна, блок catchне выполнится вообще. Если файл будет создан, блок catch не сработает.
Если же файл создать не удастся –произойдет ошибка (например, пользователь указал неправильный путь к файлу), в этом случае сработает блок catch, и пользователю будет выведено сообщение, что файл создать не удалось.
Если пользователь не вводит ничего, ему выводится предупреждающее сообщение: "Введите путь к файлу!" (см. рис. 9.20).
Пользователь ввёл,например, путь C:\test.txt, т. е. имя создаваемого файла и путь кнему. В этом случае при нажатии пользователем кнопки "Создать новый"появляется сообщение "Файл создан!". Это информационное сообщение об успешном действии, иконка уже другая.Пользователь нажимает "OK"–окно закрывается.
Рис. 9.21
Проверим, действительно ли файл был создан. Перейдём в корень дискаC:\. Появился новый файл под названием test.txt, созданный программно.
Вернемся к нашему приложению и создадим еще один файл,например, test123.txt– в корне дискаC:\появился еще один файл. Если файл с таким именем уже существует, при выполнении метода createNewFile(), новый файл создаваться не будет.
Теперь создадим команды для кнопки "Удалить".
Выделим её на форме и при помощи двойного щелчка левой клавиши мыши создадим обработчик события –actionPerformed(), Внутри обработчика событий разместим для выполнения программный код.
Блок, выполняющий подобные действия, уже реализован. Найдём обработчик событий, созданный для предыдущей кнопки. Он подключён к кнопкеbuttonNovyi. С помощью комбинации клавиш Ctrl-С копируем часть программного кода, начиная с объявления переменой strи заканчивая закрывающей фигурной скобкой конструкции else.Переходим к создаваемому обработчику событий и вставляем при помощи Ctrl-V этот блок.
Некоторые фрагменты здесь будут работать так же, как и в предыдущем случае: например, нужно получить в переменную строкового типа значение текстового поля. Если текстовое поле пустое isEmpty(), требуется вывести пользователю сообщение: "Введите путь к файлу!". Эта часть остаётся без изменения. Таким образом, часть программного кода не меняется, её заново писать не надо. Необходимо подправить некоторую часть программного кода и получится следующее:
Опишем процесс удаления файла (часть программного кода в блокеelse).
Мы, воспользовавшись классом File,создали переменную типа File, передав ей путь к этому файлу. Путь находится сейчас в переменной str.
Файл нужно удалить, а не создать, поэтому в данном случае, вместо метода createNewFile(), обращаясь к переменной nfтипа Fileчерез оператор точка (.)., нужно вызвать метод delete(). Метод delete() удаляет файл.
После удалёния файла пользователю вместо сообщения "Файл создан!"выводится сообщение "Файл удалён!". Пользователь получил сообщение об успешном удалёнии файла.
Данная конструкция может также сработать и неуспешно,например, когда пользователь пытается удалить файл, изначально отсутствующий на диске. Поэтому, прежде чем удалять файл,сначала нужно проверить наличие этого файла на диске.
Для проверки наличия файла на диске служит метод exists().Этот метод, подобно методу isEmpty() возвращает значение типа "булево". "Истина" –если файл присутствует на диске, ложь в противном случае.
Запишем конструкциюif: обратимся к переменной nfи вызовем метод exists(). Если он возвращает значение "Истина", значит, файл с таким именем на диске действительно существует,в этом случае его можно удалять. Послеifставим фигурные скобки. Если файл существует, он удаляется, и пользователю выводится сообщение, что файл удалён.
Если файл не существует,пользователю выводится другое сообщение:"Файл не найден!". Копируем строку, выводящую диалоговое окно, вставляем её в блок else, и записываем в нём:"Файл не найден!"(конструкцию try ... catch удаляем).
Давайте проверим, как это работает.
В корне диска C:\есть два файла.Удалим файл test.txt.
Записываем путь к этому файлу: C:\test.txt, и нажимаем на кнопку "Удалить".
Появилось сообщение:"Файл удалён!"(см. рис. 9.22):
Рис. 9.22
Переходим на дискC:\и видим, что файл действительно исчез, т. е. был удалён.Тестируем кнопку дальше. Возвращаемся в приложение. Файл уже удалён, теперь файлаtest.txtв корне диска C:\нет.Снова нажимаем кнопку "Удалить",пытаясь удалить несуществующий файл. Методexists()определил, что файла нет, и появилось сообщение: "Файл не найден!"(см. рис. 9.23).
Рис. 9.23
Удалим второй файлtest123.txt.Указываем c:\test123.txt, нажимаем кнопку "Удалить". Вновь выведено сообщение: "Файл удалён!".Переходим в корень диска C:\, файл действительно исчез. Еще раз нажмем на кнопку "Удалить". Выводится сообщение: "Введите путь к файлу!".
Теперь зададим действия для кнопки "Переименовать".
Выделим кнопку на форме и создадим для нее обработчик событий–actionPerformed(). Сейчас опять можно не писать программный код полностью, а воспользоваться кодом, уже написанным для предыдущей кнопки buttonUdalit.
Выделим блок программного кода, начиная от строки объявления переменной strи заканчивая закрывающей фигурной скобкой конструкцииelse, копируем его, переходим в обработчик кнопки"Переименовать" и вставляем в него программный код.
Выясним, какая часть программного кода на этот раз останется без изменений, и что изменится.
В переменную strснова запишем значение текстового поля, срезав пробелы справа и слева командой trim().Затем проверяем при помощи метода isEmpty()пуста ли строка. Если строка пустая,выводим пользователю сообщение: "Введите путь к файлу!"Пока все без изменений. После некоторых изменений в программном коде – получится следующее(изменения выделены жирным шрифтом):