Лабораторная работа на тему работа со сканером
ЛАБОРАТОРНАЯ РАБОТА №6-7. НА ТЕМУ РАБОТА СО СКАНЕРОМ. СОЗДАНИЕ МЕНЮ. РАБОТА С ФАЙЛАМИ.
Откройте Java-проект, созданный в лабораторной работе №4. Изменим набор классов Item, Book, MusicCD, MusicDVD и TestItem для организации работы со сканером и возможностью ввода и вывода данных в внешние файлы.
Первая задача – это работа со сканером. Изменим наши классы так, чтобы данные для новых объектов классов пользователь ввод сам с клавиатуры в консоле. Также добавим для удобства общее пользовательское меню для работы с классами, в котором организуем ввод данных для создания объектов классов, сохранение и выгрузку данных в текстовые файлы.
Вторая задача – это организация работы с файлами, а именно сохранение и извлечение данных.
Первая задача
Откройте первый класс – Book.class. Добавим возможность в класс ввода данных пользователем с клавиатуры.
Для возможности работы со сканером подключите библиотеку import java. util. Scanner;
Для работы со сканером создайте следующую процедуру:
public static Book makeNewBook(Scanner in) {
in. skip("rn");
System.out.println("Программное создание объекта класса Book….");
System.out.println("Введите название книги….");
String newnaimenovanie = in. nextLine();
System.out.println("Введите фамилию автора….");
String newname = in. nextLine();
System.out.println("Введите год издательства….");
int newgod = in. nextInt();
System.out.println("Введите издательство….");
String newizdatelstvo = in. nextLine();
System.out.println("Введите цену ….");
float newprice = in. nextFloat();
System.out.println("Введите кол-во страниц….");
int newdlitelnost = in. nextInt();
return new Book (newnaimenovanie, newname, newgod, newizdatelstvo, newprice, newdlitelnost); // возвращение введенных значений в конструктор класса
}
Далее самостоятельно измените аналогично классы MusicCD, MusicDVD.
Затем добавим пользовательское меню в класс TestItem.
Подключите библиотеку import java. util. Scanner;
Создайте следующую процедуру, которая выведет меню на экран:
private static void showMenu() {
System.out.println("n");
System.out.println("1 — Show collection");
System.out.println("2 — Add new Book");
System.out.println("3 — Add new MusicCD");
System.out.println("4 — Add new MusicDVD");
System.out.println("5 — Save program");
System.out.println("6 — Load program");
System.out.println("7 — Exit");
}
Далее, для того, чтобы организовать возможность пользователю выбирать элементы меню с клавиатуры реализуем работу со сканером. Для этого внутри класса TestItem в главной процедуре main объявим сканер и реализуем работу с меню. Для этого измените процедуру main на следующую:
public static void main (String args[]) {
Scanner in = new Scanner(System.in).useDelimiter("rn");
showMenu();
while(true) {
int menuItem = in. nextInt();
if (menuItem == 7) {
System.out.println("Bye");
System.exit(0);
} else if (menuItem == 1) {
//пока ничего не делаем
} else if (menuItem == 2) {
Book newBook = Book.makeNewBook(in);
System.out.println("Информация про книгу: "+newBook. toString());
} else if (menuItem == 3) {
MusicCD newMusicCD= MusicCD. makeNewMusicCD(in);
System. out. println("Информация про музыку: "+newMusicCD. toString());
} else if (menuItem == 4) {
MusicDVD newMusicDVD= MusicDVD. makeNewMusicDVD(in);
System. out. println("Информация про фильм: "+newMusicDVD. toString());
} else if (menuItem == 5) {
// сохранить данные в файл
} else if (menuItem == 6) {
// извлечь данные из файла
}
showMenu();
}
}
Далее, организуем работу с коллекциями. Например, мы хотим вводить не по одному объекту, а хотим, чтобы каждый новый объект добавлялся в коллекцию Book, MusicCD, MusicDVD.
Создадим специальный класс для работы с коллекцией. Создайте и добавьте в свой пакет новый класс Compar. class.
import java. util.*;
public class Compar {
private Comparator<Item> comparator = null; // объявление будущей сортировки
private ArrayList<Item> item = new ArrayList<Item>(); // создание коллекции списка-массива типа класса Item – общего родительского класса
public void setItem(ArrayList<Item> item) { // присвоение коллекции
this.item = item;
}
public ArrayList<Item> getItem(){ // возвращение коллекции
return item;
}
public void add(Item item_service) {
// добавление элементов в коллекцию
this.item.add(item_service);
}
public void setComparator(Comparator<Item> comparator) {
this.comparator = comparator;
}
public void show() {
// отображение на экран всей коллекции
if (this.comparator != null)
Collections.sort(this.item, this.comparator); // сортировка коллекции
Iterator<Item> iter = this.item.iterator(); // установка итератора на начало коллекции
while (iter.hasNext()) { // пока не конец коллекции
System.out.println(iter.next()); // вывод объектов коллекции
}
}
}
Далее изменим базовый родительский класс для реализации интерфейса сортировки по коллекции.
Для этого откройте класс Item.class вверху подключите библиотеку import java.util.*;, чтобы были доступны интерфейсы Collection, ArrayList, Iterator, Comparator.
Далее измените объявление класса на следующее:
public class Item implements Comparable<Item>
Далее необходимо описать в классе метод сортировки, допустим мы будем сортировать коллекцию по возрастанию цены продукции. Для этого добавьте еще один метод в класс:
public int compareTo(Item another) {
return (int)(this.price — another. getPrice());
}
Далее изменим класс TestItem в главной процедуре main. Измените библиотеку на import java.util.*;, чтобы были доступны интерфейсы Collection, ArrayList, Iterator, Comparator.
Внутри процедуры main создайте новый объект класса Compar:
Compar compar = new Compar();
Затем изменим меню. Для того, чтобы обеспечить создание новых объектов и добавление их в коллекцию нужно вызвать метод compar. add(obj).
Например, для объектов книг меню изменится на:
else if (menuItem == 2) {
Book newBook = Book.makeNewBook(in);
System.out.println("Информация про книгу: "+newBook. toString());
compar. add(newBook);
}
Аналогично выполните изменение меню для объектов классов MusicCD и MusicDVD.
Далее, чтобы вывести всю отсортированную коллекцию на экран нужно вызвать метод compar. show(). Поэтому измените соответствующее меню на:
else if (menuItem == 1) {
compar. show(); }
Варианты заданий для самостоятельной работы
1) Записная книжка контактов. Выполнить преобразование класса в коллекцию. Создать пользовательское меню. Организовать добавление объектов в коллекцию и вывод отсортированных объектов коллекции на экран с помощью меню.
2) Система управления доставкой товара. Выполнить преобразование класса в коллекцию. Создать пользовательское меню. Организовать добавление объектов в коллекцию и вывод отсортированных объектов коллекции на экран с помощью меню.
3) Телепрограмма. Выполнить преобразование класса в коллекцию. Создать пользовательское меню. Организовать добавление объектов в коллекцию и вывод отсортированных объектов коллекции на экран с помощью меню.
4) Гостиница. Выполнить преобразование класса в коллекцию. Создать пользовательское меню. Организовать добавление объектов в коллекцию и вывод отсортированных объектов коллекции на экран с помощью меню.
5) Реализация готовой продукции. Выполнить преобразование класса в коллекцию. Создать пользовательское меню. Организовать добавление объектов в коллекцию и вывод отсортированных объектов коллекции на экран с помощью меню.
Вторая задача
Откройте Java-проект, созданный в лабораторной работе №6. Изменим набор классов Item, Book, MusicCD, MusicDVD и TestItem для организации возможности ввода и вывода данных в внешние файлы.
Для этого варианты все классы сохраняемых объектов должны реализовывать интерфейс java. io. Serializable, например изменим базовый класс:
import java. io.*;
public class Item implements Comparable<Item>, java. io. Serializable
Аналогично самостоятельно реализуйте интерфейс java. io. Serializable в классах Book, MusicCD, MusicDVD.
Затем необходимо создать в классе-родителе Item. class создать два метода для сохранения ( метод save() )и извлечения (метод load() ) объектов из внешнего файла.
public void save(DataOutputStream out) throws IOException {
}
public Item load(DataInputStream in) throws IOException {
return null;
}
Эти методы пока будут только обрабатывать исключения в случае ошибки, а саму реализацию пропишем в классе реализующего коллекции Compar.class. Аналогично самостоятельно реализуйте интерфейс java. io. Serializable в этом классе.
Далее создадим два метода для сохранения и загрузки коллекции в текстовый файл:
public void save(DataOutputStream out) throws IOException {
out. writeInt(this.item.size());
Iterator<Item> iter = this.item.iterator();
while (iter. hasNext()) {
iter. next().save(out); // сохранить объект в текстовый файл
}
}
public Compar load(DataInputStream in) throws IOException {
int size = in. readInt();
for (int i = 0; i < size; i++) {
String x = in. readUTF();
if (x. equals("Book")){
Booknew book = new Booknew();
this.item.add(book. load(in)); // добавить объект в коллекцию
}
}
return this;
}
Далее откройте класс, который будет все запускать TestItem.class. Аналогично самостоятельно реализуйте интерфейс java. io. Serializable в этом классе.
Cоздадим в нем два метода Saving и Loading:
public static void Saving(Compar compar){
DataOutputStream out = null;
ObjectOutputStream out1 = null;
try {
out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(new File("test. txt"))));
out1 = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(new File("test1.txt"))));
try {
compar. save(out);
out1.writeObject(compar. getItem());
} catch (IOException e) {
System.out.println("Maybe disk is full, or you haven’t permissions to write");
}
try {
out. close();
out1.close();
} catch (IOException e) {
System.out.println("Ошибка");
}
} catch (FileNotFoundException e) {
System.out.println("Отсутсвует файл.");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
public static Compar Loading(Compar compar){
DataInputStream in = null;
ObjectInputStream in1 = null;
try {
in = new DataInputStream(new BufferedInputStream(new FileInputStream(new File("test. txt"))));
in1 = new ObjectInputStream(new BufferedInputStream(new FileInputStream(new File("test1.txt"))));
try {
compar. setItem((ArrayList<Item>)in1.readObject());
} catch (IOException e) {
System.out.println(e. getMessage());
e. printStackTrace();
System.out.println("Maybe disk is full, or you haven’t permissions to write");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e. printStackTrace();
}
try {
in. close();
in1.close();
} catch (IOException e) {
System.out.println("ошибка");
}
} catch (FileNotFoundException e) {
System.out.println("Отсутсвует файл.");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return compar;
}
Далее изменим меню для запуска созданных методов. Для этого измените следующие пункты меню:
else if (menuItem == 5) {
Saving(compar);
}
else if (menuItem == 6) {
compar. getItem().clear();
Loading(compar);
compar. show();
}
При запуске программы, сначала подобавляйте элементы в коллекцию, например, нажав 2 элемент меню.
Затем просмотрите результат, нажав на 1 элемент меню.
Затем сохранитесь в текстовый файл под именем test1.txt. Откройте этот файл в своей папке и проверьте, что данные действительно были туда записаны.
Затем нажмите на 6 элемент меню, с помощью которого будут добавлены объекты в коллекцию из текстового файла. Затем просмотрите результат, нажав на 1 элемент меню и убедитесь, что все объекты из текстового файла были добавлены.
Варианты заданий для самостоятельной работы
1) Записная книжка контактов. Организовать сохранение объектов из коллекции в текстовый файл и загрузку объектов из текстового файла в коллекцию. Изменить пользовательское меню для добавления работы с внешними файлами.
2) Система управления доставкой товара. Организовать сохранение объектов из коллекции в текстовый файл и загрузку объектов из текстового файла в коллекцию. Изменить пользовательское меню для добавления работы с внешними файлами.
3) Телепрограмма. Организовать сохранение объектов из коллекции в текстовый файл и загрузку объектов из текстового файла в коллекцию. Изменить пользовательское меню для добавления работы с внешними файлами.
4) Гостиница. Организовать сохранение объектов из коллекции в текстовый файл и загрузку объектов из текстового файла в коллекцию. Изменить пользовательское меню для добавления работы с внешними файлами.
5) Реализация готовой продукции. Организовать сохранение объектов из коллекции в текстовый файл и загрузку объектов из текстового файла в коллекцию. Изменить пользовательское меню для добавления работы с внешними файлами.