Главная » Просмотр файлов » К. Арнольд, Д. Гослинг - Язык программирования Java

К. Арнольд, Д. Гослинг - Язык программирования Java (1160779), страница 44

Файл №1160779 К. Арнольд, Д. Гослинг - Язык программирования Java (К. Арнольд, Д. Гослинг - Язык программирования Java) 44 страницаК. Арнольд, Д. Гослинг - Язык программирования Java (1160779) страница 442019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 44)

Массив используется непосредственно, а не копируется. Достижениеконца массива buf означает завершение ввода данных из потока.public ByteArrayInputStream(byte[] buf, int offset, int length)Создает объект ByteArrayInputStream по заданному байтовому массиву, однако используется лишь часть массива buf от buf[offset] до buf [offset+length-1] или до конца массива (в зависимости от того, какая величина окажется меньше).Класс ByteArrayOutput осуществляет вывод в динамически увеличиваемый байтовый массив.

Он содержит следующие конструкторы и методы:public ByteArrayOutputStream()Создает объект ByteArrayOutputStream, размер которого выбирается по умолчанию.public ByteArrayOutputStream(int size)Создает объект ByteArrayOutputStream с заданным исходным размером.public synchronized byte[] toByteArray()Метод возвращает копию данных. Это позволяет программисту работать с массивом, не изменяя выходных данных.public int size()Возвращает текущий размер буфера.public String toString(int hiByte)Создает новый объект String на основе содержимого байтового массива. Старшие 8 бит каждого 16-разрядного символа в строкеустанавливаются равными 8 младшим битам hiByte. Также имеется переопределенная безаргументная форма toString, эквивалентная toString(0).11.9. Класс StringBufferInputStreamStringBufferInputStream читает данные из строки String, а не из байтового массива.

Класс содержит единственный конструктор, параметромкоторого является строка — источник ввода. Работа с символами строки осуществляется так, как если бы это были байты. Например,приведенная ниже программа читает символы из командной строки или из System.in:class Factor {public static void main(String[] args) {if (args.kength == 0) {factorNumbers(System.in);} else {InputStream in;for (int i = 0; i << args.lengthl i++) {in = new StringBufferInputStream(args[i]);factorNumbers(in);}}}// ...}Если команда вызывается без параметров, то factorNumbers берет числа из стандартного входного потока. Если же в командной строкеприсутствуют параметры, то для каждого из них создается объект StringBufferInput Stream и вызывается метод factorNumbers. Входные данныеэтого метода рассматриваются как единая последовательность байтов, независимо от того, взяты ли они из командной строки или изстандартного входного потока .Обратите внимание на то, что в конструктор StringBufferInputStream передается объект класса String, а не StringBuffer.Парного потока для StringBufferOutputStream не существует.

При необходимости его можно имитировать, применяя метод toString к потоку ByteArrayOutputStream.11.10. Файловые потоки и FileDescriptorВвод и вывод в приложениях часто связан с чтением/записью файлов. Файловый ввод/вывод в Java представлен двумя потоками — FileInputStream и FileOutputStream. Объекты каждого из этих типов создаются одним из трех конструкторов:●●●Конструктор с параметром типа String, содержащим имя файла.Конструктор с параметром File (см. раздел “Класс File”).Конструктор с параметром класса FileDescriptor.Файловый дескриптор FileDescriptor представляет собой системно-зависимый объект, служащий для описания открытого файла.

Он может бытьполучен вызовом метода getFD для любого объекта класса File или Random AccessFile. Объекты FileDescriptor позволяют создавать новые потокиFile или RandomAccessFile для тех же файлов, что и другие потоки, но при этом не требуется знание имени файлов. Необходимо соблюдатьосторожность и следить за тем, чтобы различные потоки не пытались одновременно совершать с файлом различные операции.

Например,невозможно предсказать, что случится, когда два потока попытаются одновременно записать информацию в один и тот же файл сиспользованием двух разных объектов File Descriptor.Метод flush класса FileOutputStream гарантирует лишь сброс содержимого буфера в файл. Он не гарантирует, что данные будут записаны надиск — файловая система может осуществлять свою собственную буферизацию.11.11. Конвейерные потокиКонвейерные (piped) потоки используются парами, предназначенными для ввода/вывода; байты, записанные во входной поток пары,считываются на выходе.

Конвейерные потоки безопасны в многопоточной среде; на самом деле, один из вполне надежных способов работы сконвейерными потоками заключается в использовании двух программных потоков — одного для чтения, а другого для записи. В случаезаполнения конвейера происходит блокировка программного потока, осуществляющего запись. Если же чтение и запись производятся в одномпрограммном потоке, то он блокируется навсегда.В приведенном ниже примере создается новый программный поток, получающий входные данные от некоторого объекта-генератора, а еговывод направляется в объект OutputStream:class Pipe {public static void main(String[] args) {try {PipedOutputStream out = new PipeOutputStream();PipedInputStream in = new PipedInputStream(out);// генератор данных выводит данные// в предоставленный ему выходной потокDataGenerator data = new DataGenerator(out);data.setPriority(Thread.MIN_PRIORITY);data.start();}}int ch;while ((ch = in.read()) != -1)System.out.print((char)ch);System.out.println();} catch (IOException e) {System.out.println("Exception: " + e);}Мы создаем конвейерные потоки, задавая PipedInputStream в качестве параметра конструктора PipedOutputStream.

Порядок значения не имеет:с тем же успехом можно было передавать выходной поток конструктору входного. Важно, чтобы парные потоки ввода/вывода были соединеныдруг с другом. Далее конструируется объект DataGenerator и выходным потоком сгенерированных данных назначается PipedOutputStream. Затемв цикле происходит чтение данных от генератора и запись их в системный выходной поток. В конце необходимо убедиться, что последняявыводимая строка будет должным образом завершена.11.12. Класс Seq uenceInputStreamКласс SequenceInputStream создает единый входной поток, читая данные из одного или нескольких входных потоков: сначала первый потокчитается до самого конца, затем — следующий за ним, и так далее, до последнего потока. Этот класс содержит два конструктора: один — дляпростейшего случая двух входных потоков, которые передаются в качестве параметров конструктора; другой конструктор предназначен дляпроизвольного количества входных потоков, в нем используется абстрактное представление Enumeration, описанное в главе 12.

Реализацияинтерфейса Enumeration позволяет получить упорядоченный список объектов любого типа. Для потока Sequence InputStream перечислениеможет содержать только объекты типа Input Stream. Если в нем окажется что-либо еще, то при попытке получения объекта из спискавозбуждается исключение SequenceInputStream.Например, приложение Factor вызывает метод factor Numbers для каждого аргумента, входящего в командную строку.

Все числа обрабатываютсяотдельно, так что подобное разобщение параметров не имеет особого значения. Тем не менее, если бы ваше приложение суммировало числа извходного потока, то было бы необходимо собрать все значения воедино. В приведенном ниже приложении SequenceInputStream используетсядля создания единого потока из объектов StringBufferInputStream для каждого из параметров:import java.io.*;import java.util.Vector;class Sum {public static void main(String[] args) {InputStream in; // поток, из которого читаются числаif (args.length == 0) {in = System.in;} else {InputStream stringIn;Vector inputs = new Vector(args.length);for (int i = 0; i << args.length; i++) {String arg = args[i] + " ";stringIn = new StringBufferInputStream(arg);inputs.addElement(stringIn);}in = new SequenceInputStream(inputs.elements());}try {double total = sumStream(in);System.out.println("The sum is " + total);} catch (IOException e) {System.out.println(e);System.exit(-1); //}}// ...}Если параметры отсутствуют, то для ввода данных используется System.in.

В противном случае создается объект Vector, размер которогопозволяет хранить столько объектов StringBufferInputStream, сколько аргументов в командной строке. Затем мы создаем поток для каждого изаргументов и добавляем в концы строк пробелы, чтобы разделить их. Затем потоки заносятся в вектор streams. После завершения цикла мывызываем метод elements вектора, чтобы получить объект Enumeration с элементами. Enumeration используется в конструктореSequenceInputStream, который сцепляет все потоки параметров в единый поток InputStream. Затем все числа в этом потоке суммируютсяметодом sumStream и выводится результат. Реализация sumStream приведена в примере из раздела “Класс StreamTokenizer”.

/Конечно, проблемуможно было решить и иначе - получить единую строку, в которую входят все параметры, и создать один поток StringBufferInputStream./Кроме того, можно было создать и новую реализацию Enumeration, которая бы обращалась за каждым аргументом к потоку StringInputStream.Подробности приведены в разделе “Интерфейс Enumeration”.11.13.

Класс LineNumberInputStreamОбъекты класса LineNumberInputStream позволяют следить за нумерацией строк во время чтения данных из входного потока. Метод getLineNumber, возвращает текущий номер строки. Нумерация строк начинается с единицы.Текущий номер строки может быть задан методом setLineNumber. Это может оказаться полезным, когда вы работаете с несколькими входнымипотоками как с одним целым, однако нумерация строк должна осуществляться относительно начала каждого из потоков.

Например, еслиSequenceInput Stream используется для чтения из нескольких файлов как из одного потока, то может возникнуть надобность в отдельнойнумерации строк для каждого из файлов, из которого поступили данные.Упражнение 11.5Напишите программу, которая читает заданный файл и ищет в нем некоторое слово. Программа должна выводить каждую строку, в которойвстретилось это слово, и ее номер.11.14. Класс PushbackInputStreamКласс PushbackInputStream обеспечивает возможность отката на один символ потока назад. Это особенно полезно при разделении входногопотока на отдельные лексемы. Например, чтобы определить, где кончается лексема, часто приходится читать символ, следующий за ее концом.После просмотра символа, завершающего текущую лексему, необходимо вернуть его во входной поток, чтобы он послужил началом следующейлексемы. В приведенном ниже примере класс PushbackInputStream используется для поиска самой длинной последовательности повторенийлюбого байта в потоке:import java.io.*;class SequenceCount {public static void main(String[] args) {try {PushbackInputStreamin = new PushbackInputStream(System.in);int max = 0;// длина найденной последовательностиint maxB = -1;// байт, из которого она состоитint b;// текущий байт входного потокаdo {int cnt;int b1 = in.read(); // первый байт// в последовательностиfor (cnt = 1; (b = in.read()) == b1; cnt++)continue;if (cnt >> max) {max = cnt; // запомнить длинуmaxB = b1; // запомнить байт}in.unread(b);// откат к началу// следующей последовательности} while (b != -1);// продолжать до конца потокаSystem.out.println(max + " bytes of " + maxB);} catch (IOException e) {System.out.println(e);System.exit(1);}}}При достижении конца одной последовательности происходит чтение байта, с которого начинается следующая последовательность.

Характеристики

Тип файла
PDF-файл
Размер
1,1 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6418
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее