ДЗ. Написать консольный калькулятор с использованием перехвата всех возможных исключений
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

static Scanner in = new Scanner(System.in);

    

/* как вариант

static double getDouble()

{

double num;

System.out.print("Введитечисло: ");

try {

     num = Double.parseDouble(in.nextLine());

    

}

catch (NumberFormatException ex)

     {

     System.out.println("Ошибкаввода!");

     num = getDouble();

     }

return num;

}*/

 

static int getInt()

{

     int num;

     System.out.print("Введите число: ");

     try {

           num = in.nextInt();

               

     }

     catch (Exception ex)

           {

           System.out.println("Ошибка ввода!");

           in.next();

           num = getInt();

           }

     return num;

}

    

static char getOperation() {

     String s = null;

     char ch;

     System.out.print("Введите знак операции (+, -, *, /): ");

     try {

           s = in.next();

           if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")) {

                ch = s.charAt(0);

           }

           else throw new Exception ("Ошибка ввода!");

     }

     catch(Exception ex)

           {

           System.out.println(ex.getMessage());

           ch = getOperation();

           }

     return ch;

}

    

static double calc(int num1, int num2, char operation)

{

     double result = 0;

     switch (operation)

     {

     case '+' :

           result = num1 + num2; break;

     case '-' :

           result = num1 - num2; break;

     case '*' :

           result = num1 * num2; break;

     case '/' :

           result = (double)num1 / num2;

     }

     return result;

}

    

     public static void main(String args[]) {

           int num1= getInt();

           char ch = getOperation();

           int num2 = getInt();

           double rez;

           try

           {

           rez = calc(num1, num2, ch);

           }

     catch(ArithmeticException ex)

           {

                System.out.println("Деление на 0");

                return;

           }

           System.out.println("Ответ: " + rez);

}   

}


 


Потоки ввода – вывода

 

Большинство программ работает с данными. При этом данные потоком поступают в программу, она их обрабатывает и передаёт дальше.

Процесс чтения данных с ресурса и записи их в назначенное место показан на рисунке ниже:

 

 

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

Различают следующие типы потоков:

¾  По направлению движения данных потоки можно разделить на две группы:

1. Поток ввода (Input) — данные поступают из потока в нашу программу. Мы их читаем из этого потока

2. Поток вывода (Output) — данные поступают в поток из нашей программы. Мы их пишем в этот поток

¾  По типу передаваемых данных:

1.  Поток байтов

2.  Поток символов (человек может визуально их прочесть)

 

В итоге мы получаем 4 типа потоков. По сути потоки можно представить, как трубу, в которую “заливаются” байты или символы.

Для каждого из этих типов Java предлагает отдельный базовый абстрактный класс. Почему абстрактный? Потому, что у нас есть специализация — файлы, сеть, память. И расширяя базовый класс специальный класс решает свои специальные задачи. Но базовые функции для всех одинаковые. Что удобно — все специальные потоки по своей сути одно и тоже. Это дает гибкость и универсальность. Вот эти классы:

1. InputStream — поток для чтения байтов (поток ввода)

2. Reader — поток для чтения символов (поток ввода)

3. OutputStream — поток для записи байтов (поток вывода)

4. Writer — поток для записи символов (поток вывода)

Ниже схематично показана программа, которая должна считать данные с потока и записать в поток:

 

Все остальные классы, работающие с потоками, являются наследниками этих абстрактных классов. Все классы - наследники мы рассматривать не будем, а только классы для работы с файлами:

 

Для работы с потоками в программе необходимо импортировать пакет java . io

Схема работы с потоком в упрощенном виде выглядит так:

1. Создается экземпляр потока

2. Поток открывается (для чтения или записи)

3. Производится чтение из потока/запись в поток

4. Поток закрывается

 

Пример программы для записи и считывания информации из текстового файла:

 

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.util.Scanner;

 

public class Main {

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

    public static void writeTextToFile() throws IOException {

              FileWriter file = new FileWriter("myfile.txt");

              file.write("Первая строка: 12 -13 17");

              file.write("\n");

              file.write("Вторая строка строка: 0 -6 12");

              file.close();

    }

 

    //считываниетекстовыхданных из файла

    public static void readTextFromFile() throws IOException {

              FileReader file = new FileReader("myfile.txt");

              Scanner scan = new Scanner(file);

              String s = null;

              while (scan.hasNextLine()){ // пока есть следующая строка

                       s = scan.nextLine();

                       System.out.println(s);

              }

                  

              file.close();

              scan.close();

    }

        

              public static void main(String args[]) throws IOException {

              writeTextToFile();

              readTextFromFile();

              }

}

 

Пример программы, создающей копию уже существующего . doc . pdf или . jpg файла (считывание и запись информации надо производить по байтам):

public static void copyFile(String source, String target) throws IOException {

               

   FileInputStream fis = new FileInputStream(source);

   FileOutputStream fos = new FileOutputStream(target);

             

       int data;

//чтение происходит по одному байту, -1 является признаком окончания //байтов

       while ( (data = fis.read()) != -1) {

           fos.write(data);

       }

           

       fis.close();

       fos.close();

    }

public static void main(String args[]) throws IOException {

copyFile("zadaniya.pdf","zadaniya_copy.pdf");

copyFile ("1. jpg ","2. jpg ");

}

 

При небольших размерах файлов все работает вполне прилично. Но если вы попробуете скопировать файл хотя бы в несколько мегабайт, то это может происходить крайне долго. Причина в том, что вы читаете по ОДНОМУ байту. Это крайне неэффективно. На самом деле для чтения каждого байта вы считываете достаточно приличный кусок данных с диска, но используете только один байт. И так много-много раз. Производительность ужасающая, загрузка дисковой подсистемы сумасшедшая.

На помощь придет буферизованные версии чтения/записи.

Буфер – это временное хранилище данных в оперативной памяти. Т.е. данные копируются из потока в буфер. После получения всех данных в буфер, они проверяются на целостность и только потом передаются в программу. Это радикально повышает производительность.

Для этого надо использовать другой вариант вызова методов read и write — он принимает в качестве входного параметра массив байтов. Т.е. при чтении поток сразу заполняет весь массив (или его часть) и делает операцию сразу для большого количества — читает или пишет.

На что следует обратить внимание в этом случае — при операции чтения вам возвращается количество реально считанных байт (если оно равно “-1”, значит поток закончился), а операция записи может писать не весь массив, а только какую-то его часть. Вы указываете индекс начального элемента массива и количество.

Пример создания копии графического файла ( в переменную buffer мы считываем байты, а в переменной size сохраняем количество реально считанных байт ):

public static void copyFile(String source, String target) throws IOException {

               

   FileInputStream fis = new FileInputStream(source);

   FileOutputStream fos = new FileOutputStream(target);

             

   byte[] buffer = new byte[8192]; // размербуфера 8 Кб

   int size = 0;

   while ( (size = fis.read(buffer)) != -1) {

       fos.write(buffer, 0, size);

   }

           

       fis.close();

       fos.close();

 

    }

    public static void main(String args[]) throws IOException {

              copyFile("1.jpg","2.jpg");

    }

 



Создание проектов JavaFX

JavaFX — платформа на основе Java для создания приложений с насыщенным графическим интерфейсом. Может использоваться для создания настольных приложений, запускаемых непосредственно из-под операционных систем (Desktop приложений); для интернет-приложений (RIA - Rich Internet Application), загружаемых пользователем через интернет, предназначенных для выполнения функций традиционных настольных приложений и работающих в браузерах; и для приложений на мобильных устройствах.

Мы будем использовать JavaFX8 (был выпущен 18 Марта 2014 года) и уже стал частью пакетов JRE/JDK вместе с версией Java 8.

Примеры приложений, созданных на javafx - http://www.oracle.com/technetwork/java/javase/overview/javafx-samples-2158687.html . Тут более 100 примеров приложений с показом возможностей работы с графикой, анимацией, мультимедиа, построением диаграмм и приведением кода программ.

Обратите внимание, что эти приложения открываются с помощью Java Web Start (часто JavaWS) — технологии, позволяющей запускать приложения на Java из браузера. Приложения Web Start работают не в окне браузера и не имеют с ним прямой связи (файл .jnlp)

JavaFX призвана заменить использовавшуюся ранее библиотеку Swing. По мимо более широких возможностей JavaFX (имеет большее количество сторонних библиотек) по сравнению со Swing, JavaFX позволяет создавать приложения с архитектурой MVC (Model – View - Controller)

 

 

Где мы будем это всё разрабатывать:

 

 

JavaFX Scene Builder - визуальный инструмент проектирования GUI в формат FXML.

Основные составляющие приложения на JavaFX:

 

 

Stage – главное окно (контейнер) приложения. Содержит объект Scene.

Scene – корневой контейнер, который содержит все компоненты интерфейса (панели, кнопки и пр.)

SceneGraph – дерево (граф) компонентов, структура GUI. Это не класс, а понятие. Каждый элемент этого графа – Node (контрол, панель, графика, медиа и т.д. )

 

Аналогия с театром

Stage – место действия (сцена) с декорациями, названием

Scene – эпизод, что показывать в данный момент. Scene меняются, Stage – один и тот же. В один момент времени – только один эпизод.

Каждый эпизод может использовать любое количество актеров – элементов управления (Node).

 

ПРОЕКТИРОВАНИЕ GUI

Проектирование GUI – подробный разбор и рисование интерфейса (макет приложения).

Существует множество Mockup сервисов для создания макетов приложения.

Например, онлайн сервис http://moqups.com/

 


 


Локализация приложения

( поддержка нескольких языков )

 

Локализация (Localization - l10n) — это процесс перевода ресурсов приложения (добавление различных файлов переводов, которые могут использоваться в приложении) в локализованные версии для каждого языка и региональных параметров, которые поддерживает приложение. Переход локализации должен происходить только после того, как выполнено условие локализуемости (Localizability), т.е. исполняемый код отделен от любых элементов пользовательского интерфейса.

С понятием локализации в Java тесно связан объект Locale.

Locale – объект, объединяющий значения (параметры) для локализации

• Язык

• Страна

• Валюта

• Часовой пояс

• Формат даты

• ...

Как только мы указываем для Locale какой - либо регион или язык, то он автоматически подтягивает все перечисленные параметры для этого региона.

Реализация поддержки нескольких языков в JavaFX (похожий подход используется и в web -  технологиях):

1. Добавить файлы *.properties для нужных языков

2. Заполнить файлы значениями «ключ-перевод»

3. Указать местоположение файлов *.properties (через код или настройки)

4. Изменить компоненты для использования файлов локализации (в коде также все текстовые значения нужно заменить на значения ключа)

5. Реализовать переключение языка в приложении

JAR – файлы

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

Дата: 2018-11-18, просмотров: 779.