Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЕВ-4791

.pdf
Скачиваний:
24
Добавлен:
07.03.2016
Размер:
2.52 Mб
Скачать

int nums[] = new int[4]; System.out.println(“Before exception is generated.”);

//Генерація винятку у зв’язку зі зверненням за межу масиву nums[7] = 10;

System.out.println(“this won’t be displayed”);

}

}

class UseThrowableMethods {

public static void main(String args[]) { try {

ExcTest1.genException();

}

catch (ArrayIndexOutOfBoundException exc) { //Перехоплення повторно згенерованого винятку

System.out.println(“Standard message is: ”); System.out.println(exc); System.out.println(“ \nStack trace: ”); exc.printStackTrace ();

}

System.out.println(“After catch statement.”);

}

}

Приклад 11.

//Використання блоку Finally class UserFinally {

//Згенерувати виняток

public static void genException(int what) { int t;

int nums[] = new int[2]; System.out.println(“Receiving “ + what); { try {

switch(what) { case 0:

t = 10/what;

// генерація помилки ділення на нуль

break;

 

case 1:

// генерація помилки звернення до масиву

nums[4] = 4;

break;

 

case 2:

// повернення з блоку try

return;

}

 

}

catch (ArithmeticException exc) { //Перехопити виняток

System.out.println(“Can’t divide by Zero!”); return;

}

catch (ArrayIndexOutOfBoundException exc) { //Перехопити виняток

System.out.println(“No matching element found.”);

}

//Цей блок виконується незалежно від того, як завершиться блок

// try/ catch

}

}

}

class FinallyDemo {

public static void main(String args[]) {

61

for(int i=0; i<3; i++) { UserFinally. genException(i); System.out.println();

}

}

}

Приклад 12.

class ThrowsDemo {

public static char prompt(String str) throws java.io.IOException {

System.out.print(str + “: “); return (char) System.in.read();

}

public static void main(String args[]) { char ch;

try {

ch = prompt (“Enter a letter”);

}

catch (java.io.IOException exc) { System.out.println (“I/O exception occurred.”); ch = ‘X’;

}

System.out.println (“You pressed ” + ch);

}

}

Приклад 13.

class NonIntResultException extends Exception { int n;

int d;

NonIntResultException (int i, int j) { n = i;

d = j;

}

public String toString() {

return “Result of “ + n + “ / “ + d + ” is non-integer.”;

}

}

class CustomExceptDemo {

public static void main(String args[]) {

int numer[] = {4, 8, 15, 32, 64, 127, 256, 512}; int denom[] = {2, 0, 4, 4, 0, 8};

for(int i=0; i<numer.length; i++) { try {

throw new

NonIntResultException (numer[i], denom[i]); System.out.println(numer[i] + “ / ” +

denom[i] + “ is “ + numer[i]/denom[i]);

}

catch (ArithmeticException exc) { //Перехопити виняток

System.out.println(“Can’t divide by Zero!”);

}

catch (ArrayIndexOutOfBoundException exc) { //Перехопити виняток

System.out.println(“No matching element found.”);

}

62

catch (NonIntResultException exc) { System.out.println(exc);

}

}

}

}

Рекомендована література [5, 7, 8-12, 14].

63

Тема 12. ОРГАНІЗАЦІЯ СИСТЕМИ ВВЕДЕННЯ/ВИВЕДЕННЯ В JAVA

Вивчивши матеріал теми, студенти знатимуть:

характеристику системи введення /виведення в Java;

визначення основних типів вхідних та вихідних потоків;

які нові властивості й корисні інтерфейси додаються до системи введення /виведення;

класи для читання і запису даних;

стандартне введення/виведення;

механізм стиснення даних;

процеси організації введення/виведення.

Вивчення матеріалу теми допоможе студентам:

створювати директорії класу File;

визначати класи для читання і запису даних;

формувати джерела та приймальники даних;

залучати стандартні засоби введення/виведення даних Java;

використовувати процедури стиснення даних;

закріпляти дії, які виконувані в процесах розбиття вхідних даних.

12.1.Навчальні завдання для виконання практичної роботи

Мета роботи: сформувати практичні навички з фундаментальних конструкцій введення/виведення даних і визначити технологію складання та виконання програм різноманітної структури.

План

1.Основний набір засобів для організації введення/виведення даних.

2.Різновиди потоків InputStream і OutputStream.

3.Класи введення/виведення даних. Зміна поведінки потоку.

4.Клас RandomAccessFile.

5.Використання потоків введення/виведення даних. Канали.

6.Перенаправлення стандартного введення/виведення даних.

7.Підвищення швидкості операцій введення/виведення даних за допомогою споріднених класів.

8.Підключення до Internet: клас URL.

9.Використання класу Socket для виконання низькорівневих мережевих операцій.

10.Створення документації.

12.2.Навчальні завдання для опрацювання лабораторної роботи

Індивідуальне виконання лабораторної роботи кожним студентом передбачає закріплення теоретичних знань.

Лабораторна робота

«Технологія виконання стиснення даних»

Мета роботи: закріпити теоретичні положення в практичних діях формування та виконання додатка мовою Java для стиснення даних файла, ім’я якого передається з командного рядка. Розробити власну програму або виконати завдання, запропоновані викладачем.

Досягнення мети:передбачає виконання таких дій.

1.За допомогою будь-якого редактора текстів чи блокнота сформувати готовий приклад додатка, який запропонує викладач. Такий файл повинен мати розширення *.java; тут * — ім’я файла, яке має чітко збігатися з ім’ям класу методу main().

2.Виконати компіляцію створеного файла. У разі наявності повідомлень про помилки виправити останні й запустити скоригований файл на повторну компіляцію. Результатом вдалої компіляції буде відсутність повідомлень про помилки та наявність створеного файла з розширенням class.

64

3.Запустити інтерпретатор мови Java. Результати його виконання є результатами дії створеного додатка. У разі виникнення різноманітних повідомлень скористатися опціями інтерпретатора та іншими додатковими інструментами.

4.За результатами виконання лабораторної роботи скласти звіт, який має включати:

1)титульну сторінку встановленого зразка (додаток 1);

2)на першій сторінці розмістити:

назву роботи;

мету лабораторної роботи;

шляхи виконання лабораторної роботи (розширений план поетапного виконання роботи).

3)сторінки від 2-ї …, мають містити:

перелік усіх повідомлень виконання прикладу 1 та опис їх;

перелік усіх повідомлень прикладу 2 та конкретний опис й умови застосування їх;

текст власної розробленої програми (якщо власна програма відсутня, цей пункт відсутній);

текст або тексти програм мовою Java, які запропоновані викладачем.

Приклади для виконання лабораторної роботи

Виконується налаштування класів стиснення даних для вашого вихідного потоку даних:

класи GZIPOutputStream або ZIPOutputStream для стиснення даних і GZIPInputStream або

ZIPInputStream для розпакування стислих даних.

Решту відносять до елементарних операцій введення /виведення даних. У прикладах використовують змішані байтові та символьні потоки: потік in використовує класи на основі Reader, тоді коли конструктор класу стиснення даних GZIPOutputStream використовує тільки потоки на основі OutputStream, але не Writer. Тому при відкритті файла потік стиснення даних GZIPInputStream перетворюється на символьний потік Reader.

Приклад 1. Просте стиснення єдиного потоку даних алгоритмом GZIP. import java.io.*;

import java.util.zip.*; public class GZIPcompress {

// Пересилаємо можливі винятки на консоль: public static void main(String args[]) {

throws IOExeption { BufferedReader in =

new BufferedReader( new FileReader(args[0]));

BufferedOutputStream out = new BufferedOunputStream(

new GZIPOutputStream(new FileOutputStream(test.gz))); System.out.println(“Записуємо файл”);

int c;

while((c = in.read()) != -1) out.write(c); in.close();

out.close(); System.out.println(“Читаємо файл”); BufferedReader in2 =

new BufferedReader( new InputStreamReader(

new GZIPInputStream ( new FileInputStream(test.gz)))); String s;

while((s = in2.readLine()) != null) System.out.println(s);

}

}

Ім’я файла для стиснення передається з командного рядка.

Приклад 2. Стиснення файлів у форматі Zip. import java.io.*;

65

import java.util. *; import java.util.zip.*;

public class ZIPcompress {

// Пересилаємо можливі винятки на консоль: public static void main(String args[]) {

throws IOExeption { FileOutputStream f =

new FileOutputStream(test.gz); CheckedOutputStream csum =

new CheckedOutputStream( f, new Adler32());

ZipOutputStream out = new ZipOutputStream(

new BufferedOutputStream(csum); // додаємо до архіву коментарі

out.setComment(“Перевірка Zip стискання java ”);

//Але метод для отримання коментаря

//get.Comment() відсутній

for (int i =0; i <args.length; i++) { System.out.println(

“Додавання файла “ + args[i]); BufferedReader in =

new BufferedReader( new FileReader(args[i]));

out.putNextEntry (new ZipEntry(args[i])); int c;

while((c = in.read()) != -1) out.write(c); in.close();

}

out.close();

//Контрольна сума доступна тільки після закриття файла

System.out.println (“ Контрольна сума:” + csum.getChecksum().getValue());

//Зараз виймаємо файли

System.out.println(“Читання файла з архівом “); FileInputStream fi = new FileInputStream(“test.zip”); CheckedInputStream csumi =

new CheckedInputStream( fi, new Adler32());

ZipInputStream in2 = new ZipInputStream( new BufferedInputStream(csumi));

ZipEntry ze;

while((ze = in2.getNextEntry()) != null) { System.out.println(“Розпакування файла ” + ze); int x;

while((x = in2.read()) != -1) System.out.write(x);

}

System.out.println (“ Контрольна сума:” + csumi.getChecksum().getValue());

in2.close();

//Альтернативний спосіб відкрити і прочитати

//файли у форматі Zip:

ZipFile zf = new ZipFile (“test.zip”); Enumeration e = zf.entries(); while(e.hasMoreElements()) {

ZipEntry ze2 = new (ZipEntry) e.nextElement(); System.out.println (“ Упакований файл:” + ze2);

66

}

}

}

12.3. Перелік завдань для виконання самостійної роботи

Мета роботи: закріпити теоретичні погляди на фундаментальні механізми введення/ виведення даних та визначити практичну сутність їх.

Навчальні завдання

1.Відкрийте текстовий файл, який можна прочитати порядково. Зчитуйте з нього по одному рядку String і помістіть отриману інформацію в список LinkedList. Надрукуйте всі рядки у зворотному порядку, використовуючи можливості класу LinkedList.

2.Модифікуйте завдання 1 так, щоб ім’я файла з опрацьованим текстом передавалося з командного рядка.

3.Модифікуйте завдання 2 так, щоб усі зчитані рядки перетворилися на верхній регістр літер, і надрукуйте результат у стандартне виведення System.out.

4.Модифікуйте завдання 2 так, щоб програма також опрацювала додаткові аргументи командного рядка як слова для пошуку у файлі. Надрукуйте рядки, в яких були знайдені вказані слова.

5.Створіть клас з ім’ям SortedDirList, конструктор якого приймає інформацію про шлях файла і на підставі цієї інформації складає відсортований список файлів у вказаній директорії. Створіть два перевантажені методи list(), один з яких має повертати весь список файлів, а другий — підмножину списку залежно від переданого йому параметра. Додайте до класу метод size(), який набуває як параметр ім’я файла і повертає розмір цього файла.

6.Змініть програму DirList.java так, щоб фільтр імен файлів FilenameFilter сам відкривав файли і визначав придатність їх до списку файлів. Основою для цього є їхній внутрішній зміст і допоміжні аргументи командного рядка:

програма DirList.java import java.io.*; import java.util.*;

import com.bruceeckel.util.*; public class DirList {

public static void main(String[] args) { File pach = new File(“.”);

String[] list;

if (args.length ==0) list = path.list(); else

list = path.list(new DirFilter(args[0]))ж Arrays.sort(list, new AlphabeticComparator());

for (int i=0; i<list.length; i++) System.out.println(list[i]);

} }

class DirFilter implements FilenameFilter { String = afn;

DirFilter(String afn) {this.afn = afn;}

public boolean accept(File dir, String name) { String f = new File(name).getName();

Return f.index0f(afn) != -1;

}

}///:~

7.Для програми WordCount.java

import java.io.*; import java.util.*; class Counter {

private int i=1;

67

int read() {return i;} void increment() { i++; }

}

public class WordCount { private FileReader file; private StreamTokenizer st;

// Таблиця TreeMap зберігає ключі відсортованими private TreeMap counts = new TreeMap(); WordCount(String filename)

throws FileNotFoundException { try {

file = new FileReader(filename);

st = new StreamTokenizer(new BuferedReader(file)); st.ordinaryChar(`.`);

st.ordinaryChar(`-`);

}

cath(FileNotFoundException e ) { System.err.println(

“Неможливо відкрити файл” + filename );

throw e;

}

}

void cleanup() { try {

file close();

}catch (IOException e) { System.err.println(

“Неможливо виконати file.close()”);

}

}

void countWords() { try {

while(st.nextToken() != StreamTokenizer.TT_EOF)

{String s; switch(st.ttype) {

case StreamTokenizer.TT_EOL; s = new String(“EOL”); break;

case StreamTokenizer.TT_NUMBER; s = Double.toString(st.nval); break;

case StreamTokenizer.TT_WORD; s = st.sval;

break; default: //

s = String.value0f((char)st.ttype);

}

if (counts.containsKey(s)) ((Counter)counts.get(s).increment();

else

counts.put(s. new Counter());

}

}catch (IOException e) { System.err.println(

“Помилка при виклику методу st.nextToken();

}

}

Collection values() { return counts.values();

68

}

Set keySet() {return coun.keySet(); } Counter getCounter(String s) {

return (Counter)counts.get(s);

}

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

WordCount wc = new WordCount(args[0]); wc.countWords();

Iterator keys = wc.keySet().iterator(); while(keys.hasNext()) {

String key = (String)keys.next(); System.out.println(key + “:”

+ wc.getCounter(key).read());

}

wc.cleanup();

}

}///:~

7.1Змінити програму так, щоб вона сортувала слова за абеткою.

7.2Змінити програму так, щоб вона використовувала клас із рядком String і лічильником для кожного окремого слова, а також множину Set для зберігання списку слів.

12.4. Приклад реального класу

Методи якого передбачають введення-виведення даних і генерацію виняткових ситуацій

Клас має назву TMedication і призначений для представлення інформації про деякі ліки аптеки. Він виконує читання списку ліків з диску та зберігає отриману інформацію в об’єкті класу Vector з іменем fFormulary.

Реальний приклад:

public class TMedication

{

// Файл з переліком ліків повинен містити три поля: назва, число дійсних одиниць і тип розфасовки (каплі, пігулки тощо)

protected static final short kNumber0fFields = 3; // Включення або відключення операторів налаштування

private static final Boolean kDebug = false; String fDrugName;

Short fStrength;

String fPackage;

protected static java.util.Vector fFormulary; TMedication (String theDrugName, Short theStrength, String

thePackage);

{

fDrugName = theDrugName; fStrength = theStrength; fPackage = thePackage;

}

protected static void init()

{

fFormulary = new java.util.Vector();

}

public static void main(Sting[] args) { try {

//Отримання з командного рядка імені файлу зі списком ліків

//Перевірка чи не порожнє значення отриманого параметра

//Якщо параметр порожній, то генерація ситуації «Параметр порожній»

if (args.length == 0)

trow (new Exception(“Введіть: TMedication імя_файлу” ));

69

// Створення порожньої колекції для розміщення списку ліків init();

// Читання списку ліків з файла на диску

System.out.println(“Читання з файлу ” + args[0] + “.”); load(args[0]);

System.out.println(); // Виведення відомостей про ліки

System.out.println(“Інформація про ібопрофене: ”); show (“Ібопрофен”); System.out.println(“Інформація про драмамин: ”); show (“Драмамин”); System.out.println(“Інформація про тайленол: ”); show (“Тайленол”);

System.out.println(); // Друк усього списку ліків

System.out.println(“Список ліків у формулярі: ”); show();

}

catch (Exception e)

{

System.err.println(e.getMessage());

e.printStackTrace();

}

}

protected static void load(String theFileName) throws Exception

{

try {

// Перевірка існування файла із вказаним ім’ям if (theFileName.length() == 0)

throw (new Exception(“Помилка: файл порожній”)); //Відкриття файлу для читання

java.io.BufferedReader theStream = new java.io.BufferedReader(

new java.io.FileReader(theFileName)); //Читання рядка файла (для перевірки існування даних) //Організація циклу зчитування даних з файла на диску

String theInpunString = new String();

while ((theInpunString = theSrteam.readLine()) != null)

{

// Виведення рядка на екран для контролю введення даних

System.out.println(theInputString); //Розміщення зчитаних даних у список (формуляр)

java.util.StringTokenizer theTokenizer = new java.util.StringTokenizer(theInputString);

if (theTokenizer.countTokens() != kNumber0fFields) throw (new Exception(“Помилковий формат файла”));

//Перше поле повинно бути назвою ліків

String theDrugName = theTokenizer.nextToken();

Short theStrength = Short.value0f(theTokenizer.nextToken()); String thePackage = theTokenizer.nextToken(); TMedication theTMedication =

new TMedication(theDrugName, theStrength, thePackage); if (kDebug)

{

System.out.println(“Назва: ” + theDrugName); System.out.println(“Од.: ” + theStrength.toString()); System.out.println(“Pозфасування: ” + thePackage);

}

//Збереження всього об’єкта в колекції

70