|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Scanner(ReadableByteChannel source, String charset)Scanner(String source), где source – источник входных данных, а charset – кодировка. Объект класса Scanner читает лексемы из источника, указанного в конструкторе, например из строки или файла. Лексема – это набор данных, выделенный набором разделителей (по умолчанию пробелами). В случае ввода из консоли следует определить объект: Scanner con = new Scanner(System.in); После создания объекта его используют для ввода, например целых чисел, следующим образом: write(con.hasNextInt()) { int n = con.nextInt(); } В классе Scanner определены группы методов, проверяющих данные заданного типа на доступ для ввода. Для проверки наличия произвольной лексемы используется метод hasNext(). Проверка конкретного типа производится с помощью одного из методов boolean hasNext Тип () или boolean hasNext Тип (int radix), где radix – основание системы счисления. Например, вызов метода hasNextInt() возвращает true, только если следующая входящая лексема – целое число. Если данные указанного типа доступны, они считываются с помощью одного из методов Тип next Тип (). Произвольная лексема считывается методом String next(). После извлечения любой лексемы текущий указатель устанавливается перед следующей лексемой. // пример # 10: разбор файла: ScannerLogic.java: ScannerDemo.java package chap09; import java.io.*; import java.util.Scanner;
class ScannerLogic { static String filename = "scan.txt"; public static void scanFile() { try { FileReader fr = new FileReader(filename); Scanner scan = new Scanner(fr); while (scan.hasNext()) { //чтение из файла
if (scan.hasNextInt()) System. out. println( scan.nextInt() + ":int"); else if (scan.hasNextDouble()) System. out. println( scan.nextDouble() + ":double"); else if (scan.hasNextBoolean()) System. out. println( scan.nextBoolean() + ":boolean"); Else System. out. println( scan.next() + ":String"); } } catch (FileNotFoundException e) { System. err. println(e); } } public static void makeFile() { try { FileWriter fw = new FileWriter(filename); //создание потока для записи fw.write("2 Java 1,5 true 1.6 "); //запись данных fw.close(); } catch (IOException e) { System. err. println(e); } } } public class ScannerDemo { public static void main(String[] args) { ScannerLogic. makeFile (); ScannerLogic. scanFile (); } } В результате выполнения программы будет выведено: Int Java:String Double True:boolean String Процедура проверки типа реализована при с помощью методов hasNext Тип (). Такой подход предпочтителен из-за отсутствия возможности возникновения исключительной ситуации, так как ее обработка требует на порядок больше ресурсов, чем нормальное течение программы. Для чтения строки из потока ввода применяются методы next() или nextLine(). Объект класса Scanner определяет границы лексемы, основываясь на наборе разделителей. Можно задавать разделители с помощью метода useDelimiter(Pattern pattern) или useDelimiter(String /* пример # 11: применение разделителей: ScannerDelimiterDemo.java*/ package chapt09; import java.util.Scanner; public class ScannerDelimiterDemo { public static void main(String args[]) { double sum = 0.0;
Scanner scan = new Scanner("1,3;2,0; 8,5; 4,8; 9,0; 1; 10"); scan.useDelimiter(";\\s*"); while (scan.hasNext()) { if (scan.hasNextDouble()) sum += scan.nextDouble(); else System. out. println(scan.next()); } System. out. printf("Сумма чисел = " + sum); } } } В результате выполнения программы будет выведено: Сумма чисел = 36.6 Использование шаблона "; *" указывает объекту класса Scanner, что ‘; ’ и ноль или более пробелов следует рассмативать как разделитель. Метод String findInLine(Pattern pattern) или String Методы String findWithinHorizon(Pattern pattern, int count) и String findWithinHorizon(String pattern, int count) производят поиск заданного шаблона в ближайших count символах. Можно пропустить образец с помощью метода skip(Pattern pattern). Если в строке ввода найдена подстрока, соответствующая образцу pattern, метод skip() просто перемещается за нее в строке ввода и возвращает ссылку на вызывающий объект. Если подстрока не найдена, метод skip() генерирует исключение NoSuchElementException. Архивация Для хранения классов языка Java и связанных с ними ресурсов в языке Java используются сжатые архивные jar -файлы. Для работы с архивами в спецификации Java существуют два пакета – java.util.zip и java.util.jar соответственно для архивов zip и jar. Различие форматов jar и zip заключается только в расширении архива zip. Пакет java.util.jar аналогичен пакету java.util.zip, за исключением реализации конструкторов и метода void putNextEntry(ZipEntry e) класса JarOutputStream. Ниже будет рассмотрен только пакет java.util.jar. Чтобы переделать все примеры на использование zip -архива, достаточно всюду Пакет java.util.jar позволяет считывать, создавать и изменять файлы форматов jar, а также вычислять контрольные суммы входящих потоков данных. Класс JarEntry (подкласс ZipEntry) используется для предоставления доступа к записям jar -файла. Наиболее важными методами класса являются: void setMethod(int method) – устанавливает метод сжатия записи; int getMethod() – возвращает метод сжатия записи; void setComment(String comment) – устанавливает комментарий записи; String getComment() – возвращает комментарий записи; void setSize(long size) – устанавливает размер несжатой записи; long getSize() – возвращает размер несжатой записи; long getCompressedSize() – возвращает размер сжатой записи; У класса JarOutputStream существует возможность записи данных в поток вывода в jar -формате. Он переопределяет метод write() таким образом, чтобы любые данные, записываемые в поток, предварительно сжимались. Основными методами данного класса являются: void setLevel(int level) – устанавливает уровень сжатия. Чем больше уровень сжатия, тем медленней происходит работа с таким файлом; void putNextEntry(ZipEntry e) – записывает в поток новую jar -запись. Этот метод переписывает данные из экземпляра JarEntry в поток вывода; void closeEntry() – завершает запись в поток jar -записи и заносит дополнительную информацию о ней в поток вывода; void write(byte b[], int off, int len) – записывает данные из буфера b начиная с позиции off длиной len в поток вывода; void finish() – завершает запись данных jar -файла в поток вывода без закрытия потока; void close() – закрывает поток записи. /* пример # 12: создание jar-архива: PackJar.java */ package chapt09; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; import java.util.zip.Deflater;
public class PackJar { public static void pack(String[] filesToJar, String jarFileName, byte [] buffer) { try { JarOutputStream jos = new JarOutputStream( new FileOutputStream(jarFileName)); // метод сжатия jos.setLevel(Deflater. DEFAULT_COMPRESSION); for (int i = 0; i < filesToJar.length; i++) { System. out. println(i); jos.putNextEntry(new JarEntry(filesToJar[i]));
FileInputStream in = new FileInputStream(filesToJar[i]); int len; while ((len = in.read(buffer)) > 0) jos.write(buffer, 0, len); jos.closeEntry(); in.close(); } jos.close(); } catch (IllegalArgumentException e) { e.printStackTrace(); System. err. println("Некорректный аргумент"); } catch (FileNotFoundException e) { e.printStackTrace(); System. err. println("Файл не найден"); } catch (IOException e) { e.printStackTrace(); System. err. println("Ошибка доступа"); } } public static void main(String[] args) { System. out. println("Создание jar-архива"); // массив файлов для сжатия String[] filesToJar = new String[2]; filesToJar[0] = "chapt09//UseJar.java"; filesToJar[1] = "chapt09//UseJar.class"; byte [] buffer = new byte [1024]; // имя полученного архива String jarFileName = "example.jar"; pack (filesToJar, jarFileName, buffer); } } Класс JarFile обеспечивает гибкий доступ к записям, хранящимся в jar -файле. Это очень эффективный способ, поскольку доступ к данным осуществляется гораздо быстрее, чем при считывании каждой отдельной записи. Единственным недостатком является то, что доступ может осуществляться только для чтения. Метод entries () извлекает все записи из jar -файла. Этот метод возвращает список экземпляров JarEntry – по одной для каждой записи в jar - файле. Метод getEntry(String name) извлекает запись по имени. Метод getInputStream() создает поток ввода для записи. Этот метод возвращает поток ввода, который может использоваться приложением для чтения данных записи. Класс JarInputStream читает данные в jar -формате из потока ввода. Он переопределяет метод read() таким образом, чтобы любые данные, считываемые из потока, предварительно распаковывались. /* пример # 13: чтение jar-архива: UnPackJar.java */ package chapt09; import java.io.*; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile;
public class UnPackJar { private File destFile; // размер буфера для распаковки public final int BUFFER = 2048;
public void unpack(String destinationDirectory, String nameJar) { File sourceJarFile = new File(nameJar); try { File unzipDestinationDirectory = new File(destinationDirectory); // открытие zip-архива для чтения JarFile jFile = new JarFile(sourceJarFile); Enumeration jarFileEntries = jFile.entries(); while (jarFileEntries.hasMoreElements()) { // извлечение текущей записи из архива JarEntry entry = (JarEntry) jarFileEntries.nextElement();
String entryname = entry.getName(); //entryname = entryname.substring(2); System. out. println("Extracting: " + entry); destFile = new File(unzipDestinationDirectory, entryname); // определение каталога File destinationParent = destFile.getParentFile(); // создание структуры каталогов destinationParent.mkdirs(); // распаковывание записи, если она не каталог if (!entry.isDirectory()) { writeFile(jFile, entry); } } jFile.close(); } catch (IOException ioe) { ioe.printStackTrace(); } } private void writeFile(JarFile jFile, JarEntry entry) throws IOException { BufferedInputStream is = new BufferedInputStream( jFile.getInputStream(entry)); int currentByte; byte data[] = new byte [BUFFER]; // запись файла на диск BufferedOutputStream dest = new BufferedOutputStream( new FileOutputStream(destFile), BUFFER);
while ((currentByte = is.read(data, 0, BUFFER)) > 0){ dest.write(data, 0, currentByte); } dest.flush(); dest.close(); is.close(); } public static void main(String[] args) { System. out. println( "Извлечение данных из jar-архива"); // расположение и имя архива String nameJar = "c:\\work\\example.jar"; // куда файлы будут распакованы String destination = "c:\\temp\\"; new UnPackJar().unpack(destination, nameJar); } } Задания к главе 9 Вариант A В следующих заданиях требуется ввести последовательность строк из текстового потока и выполнить указанные действия. При этом могут рассматриваться два варианта: · каждая строка состоит из одного слова; · каждая строка состоит из нескольких слов. Имена входного и выходного файлов, а также абсолютный путь к ним могут быть введены как параметры командной строки или храниться в файле. 1. В каждой строке найти и удалить заданную подстроку. 2. В каждой строке стихотворения Александра Блока найти и заменить заданную подстроку на подстроку иной длины. 3. В каждой строке найти слова, начинающиеся с гласной буквы. 4. Найти и вывести слова текста, для которых последняя буква одного слова совпадает с первой буквой следующего слова. 5. Найти в строке наибольшее число цифр, идущих подряд. 6. В каждой строке стихотворения Сергея Есенина подсчитать частоту повторяемости каждого слова из заданного списка и вывести эти слова в порядке возрастания частоты повторяемости. 7. В каждом слове сонета Вильяма Шекспира заменить первую букву слова на прописную. 8. Определить частоту повторяемости букв и слов в стихотворении Александра Пушкина. Вариант B Выполнить задания из варианта B главы 4, сохраняя объекты приложения в одном или нескольких файлах с применением механизма сериализации. Объекты могут содержать поля, помеченные как static, а также transient. Для изменения информации и извлечения информации в файле создать специальный класс-коннектор с необходимыми для выполнения этих задач методами. Вариант С При выполнении следующих заданий для вывода результатов создавать новую директорию и файл средствами класса File. 1. Создать и заполнить файл случайными целыми числами. Отсортировать содержимое файла по возрастанию. 2. Прочитать текст Java-программы и все слова public в объявлении атрибутов и методов класса заменить на слово private. 3. Прочитать текст Java-программы и записать в другой файл в обратном порядке символы каждой строки. 4. Прочитать текст Java-программы и в каждом слове длиннее двух символов все строчные символы заменить прописными. 5. В файле, содержащем фамилии студентов и их оценки, записать прописными буквами фамилии тех студентов, которые имеют средний балл более “7”. 6. Файл содержит символы, слова, целые числа и числа с плавающей запятой. Определить все данные, тип которых вводится из командной строки. 7. Из файла удалить все слова, содержащие от трех до пяти символов, но при этом из каждой строки должно быть удалено только максимальное четное количество таких слов. 8. Прочитать текст Java-программы и удалить из него все “лишние” пробелы и табуляции, оставив только необходимые для разделения операторов. 9. Из текста Java-программы удалить все виды комментариев. 10. Прочитать строки из файла и поменять местами первое и последнее слова в каждой строке. 11. Ввести из текстового файла, связанного с входным потоком, последовательность строк. Выбрать и сохранить m последних слов в каждой из последних n строк. 12. Из текстового файла ввести последовательность строк. Выделить отдельные слова, разделяемые пробелами. Написать метод поиска слова по образцу-шаблону. Вывести найденное слово в другой файл. 13. Сохранить в файл, связанный с выходным потоком, записи о телефонах и их владельцах. Вывести в файл записи, телефоны которых начинаются на k и на j. 14. Входной файл содержит совокупность строк. Строка файла содержит строку квадратной матрицы. Ввести матрицу в двумерный массив (размер матрицы найти). Вывести исходную матрицу и результат ее транспонирования. 15. Входной файл хранит квадратную матрицу по принципу: строка представляет собой число. Определить размерность. Построить 2-мерный массив, содержащий матрицу. Вывести исходную матрицу и результат ее поворота на 90 градусов по часовой стрелке. 16. В файле содержится совокупность строк. Найти номера строк, совпадающих с заданной строкой. Имя файла и строка для поиска – аргументы командной строки. Вывести строки файла и номера строк, совпадающих с заданной. Тестовые задания к главе 9 Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.031 сек.) |