Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Java.doc
Скачиваний:
836
Добавлен:
04.06.2015
Размер:
5.55 Mб
Скачать

Класс StringBuffer

Строки класса StringBufferудобны в тех случаях, когда требуется производить изменения в одной и той же строке – убирать или вставлять символы, менять их местами, заменять одни на другие. Изменения значений переменных этого класса не приводит к созданию мусора, и обычно происходит значительно быстрее, чем при работе с переменными типаString: быстродействие приложения повышается в десятки раз, потребление памяти уменьшается в сотни и тысячи раз.

Помимо поля длины строки, у строк этого класса имеется еще поле capacity(емкость) – размер буфера под символы строки. Только что созданная строка имеет буфер, достаточный для хранения 16 символов. Как только буфер начинает переполняться, его емкость автоматически увеличивается, чтобы вместить новые символы.

Создать строку текста класса StringBuffer можно с помощью следующихконструкторов:

  1. создание пустойстроки:

StringBuffer text=new StringBuffer();

создана пустая строка text и автоматически зарезервирована память еще на 16 символов;

  1. создание пустойстроки с заданным размером буфера:

StringBuffer text=new StringBuffer(60);

создана пустая строка text и для нее зарезервирована память на 60+16 символов;

  1. создание копиистроки на основе существующей строки этого же класса:

StringBuffer text=new StringBuffer(StringBuffer str);

создан новый объект-строка text- копия строкиstr.

Методы для работы со строками класса StringBuffer

В классе StringBufferсобрано много методов для работы со строками:

    1. определение текущейдлиныстроки:

StringBuffer str = new StringBuffer(”Это текстовая строка”);

int n=str.length(); // n=20 – текущая длина строки в символах

    1. определение выделенного для строки объема памяти:

StringBuffer str = new StringBuffer(”Это текстовая строка”);

int n=str.capacity(); // n=36 – текущая длина строки

// плюс 16 байтов

  1. вставкаподстроки в исходную строку:

StringBuffer str = new StringBuffer(”Это текстовая строка”);

str.insert(4,”новая ”); // str=”Это новая текстовая строка”

первый аргумент метода – индекс началавставки подстроки,

  1. удалениеподстроки из исходной строки:

StringBuffer str = new StringBuffer(”Это текстовая строка”);

str.delete(4, 14); // str=”Это строка”

первый аргумент метода – индекс началаудаляемой подстроки, второй – индекс первогопослеудаляемой подстроки символа,

  1. добавлениетекста вконецстроки:

StringBuffer str = new StringBuffer(”Мы изучаем Java”);

str.append(“ и Си”); // str=”Мы изучаем Java и Си”

  1. заменаподстроки в строке:

StringBuffer str = new StringBuffer(”Мы изучаем Java”);

str.replace(3, 10, “программируем на”); // str=”Мы программируем на

// Java

первый аргумент метода – индекс началазаменяемой подстроки, второй – индекс первогопослезаменяемой подстроки символа, третий – заменяющая подстрока,

  1. переворотстроки:

StringBuffer str = new StringBuffer(”Мы изучаем Java”);

str.reverse(); // str=”avaJ меачузи ыМ

аргументов у этого метода нет,

  1. копированиестроки классаStringBufferв строку классаString:

StringBuffer str = new StringBuffer(”Мы изучаем Java”);

String text = str.toString(); // text=”Мы изучаем Java”

  1. копированиечасти строки классаStringBufferв строку классаString (StringBuffer):

StringBuffer str = new StringBuffer(”Мы изучаем Java”);

CharSequence text = str.subSequence(3, 10); // text=”изучаем

Возвращаемое значение имеет тип CharSequence, прародительский для классовString и

StringBuffer,

  1. копированиечасти строки классаStringBufferв строку классаString:

StringBuffer str = new StringBuffer(”Мы изучаем Java”);

String text= str.substring(3, 10); // text=”изучаем

  1. поискподстроки в строкеслева направо:

StringBuffer str = new StringBuffer(”Мы изучаем Java”);

String text = ”изучаем”;

int n = str.indexOf(text); // n=3

Внимание!Искомая подстрока должна быть классаString!

Если подстрока не найдена, то возвращается значение -1,

  1. поискподстроки в строкесправа налево:

StringBuffer str = new StringBuffer(”Мы изучаем языки Си и Си#”);

String text = ”Си”;

int n = str.lastIndexOf(text); // n=22

Внимание!Искомая подстрока должна быть классаString!

Если подстрока не найдена, то возвращается значение -1,

  1. заменаподстроки в строке:

StringBuffer str = new StringBuffer(”Мы изучаем Java”);

String text = ”Си”;

str.replace(11, 15, text); // str=”Мы изучаем Си

Внимание!Заменяемая подстрока должна быть классаString!

В исходной строке были заменены все символы указанного диапазона (подстрока Java) на новую строкуtext. Правая граница заменяемого диапазона должна бытьна единицу большенеобходимой.

Файлы

Программы, написанные нами до этого, воспринимали информацию только с консоли (клавиатуры) или диалоговых окон ввода и выводили результат тоже на консоль (экран монитора) или в графические компоненты.

Однако во многих случаях требуется выводить результат на принтер, в файл, базу данных или передавать по сети. Исходные данные тоже часто приходится загружать из файла, базы данных или из сети.

Для того, чтобы отвлечься от особенностей конкретных устройств ввода/вывода, в Javaупотребляется понятиепотока(stream). Поток представляет собой накапливающуюся последовательность данных, поступающих из какого-то источника. Порция данных может быть считана из потока, при этом она из него изымается. В потоке действует принцип очередиFIFO: первым пришел – первым вышел.

Считается, что в программу идет входной поток(input stream) символовUnicodeили просто байтов, воспринимаемый в программе методамиread().Из программы методамиwrite(),print(), println(), printf()выводится выходной поток (output stream) символов или байтов. При этом неважно, куда направлен этот поток – на консоль, на принтер, в файл или в сеть.

Понятие потока оказалось настолько удобным и облегчающим программирование ввода/ вывода, что в Javaпредусмотрена возможность создания потоков, направляющих символы или байты не на внешнее устройство, а в массив или из массива, то есть связывающих программу с областью оперативной памяти. Более того, можно создать поток, связанный со строкой типаString, находящейся также в оперативной памяти. Еще один вид потока – поток байтов, составляющих объектJava. Его можно направить в файл или передать по сети, а потом восстановить в оперативной памяти. Эта операция называетсясериализацией(serialization) объектов.

Методы организации потоков собраны в классы пакета java.io.

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

Полномасштабная работа с файлами принадлежит к прерогативам операционной системы. Здесь мы используем специальные команды создания, просмотра, копирования и удаления файлов, знакомимся с их свойствами, сортируем их, а также объединяем в иерархическую древовидную структуру каталогов. Однако выполнение всех перечисленных операций с файлами организуется и осуществляется, как правило, вручную. Средства работы с файлами, предусмотренные в Java, позволяют автоматизировать эти функции.

Существуют задачи, для которых заранее невозможно определить количество выходных или входных данных. Оно определяется только в процессе решения конкретной задачи, то есть при работе программы. Поэтому возникла необходимость в специальной структуре данных, которая представляла бы собой последовательность компонентов, в общем случае разнотипных, причем длина этой последовательности заранее не определялась, а конкретизировалась при выполнении программы. К тому же, эта структура данных должна была бы храниться не в оперативной памяти компьютера, а на внешних устройствах.

В современных алгоритмических языках такую структуру данных называют файлом.

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

Аналогом файлов является магнитофонная лента: количество записей в ней заранее неизвестно, всегда доступна для прослушивания только текущая запись, и для прослушивания очередной записи необходимо прослушать или перемотать все предыдущие.

Поскольку файлы в большинстве современных операционных систем понимаются как последовательность байтов, для файлового ввода/вывода создаются байтовые потоки с помощью классов FileInputStream(потокввода– чтение из файла) иFileOutputStream(потоквывода– запись в файл). Это особенно удобно для бинарных файлов, хранящих байт-коды, архивы, изображение, звук. Но очень много файлов содержат тексты, составленные из символов. Несмотря на то, что символы могут храниться в кодировкеUnicode, эти тексты чаще всего записываются в байтовых кодировках. Поэтому и для текстовых файлов можно использовать байтовые потоки. В таком случае со стороны программы придется организовать преобразование байтов в символы и обратно.

Чтобы облегчить это преобразование, в пакет java.ioвведены классыFileReaderиFileWriter. Они организуют преобразование потока: со стороны программы потоки символьные, со стороны файла – байтовые. Несмотря на различие потоков, использование классов файлового ввода/вывода очень похоже.

Чтобы открыть нужный файл для чтения или записи, необходимо создать объект класса FileInputStream и FileOutputStream. Аргументом конструктора класса указывается полное имя открываемого файла. Конструкторы обоих классов могут выбрасывать необрабатываемое исключение классаFileNotFoundException. Таким образом, создание объекта соответствующего класса в случае успеха означает открытие соответствующего файла для чтения/записи. После завершения работы с файлом его необходимо закрыть с использованием методаclose(),который определен в каждом из классов.

Для побайтового считыванияданных из файла используется методread()классаFileInputStream. Считанный байт возвращается в видецелого числа. При считывании символа конца файла (EOF) методомread()в качестве результата возвращается значение-1.

Для записиданных в файл используется методwrite()классаFileOutputStream. Записываемый в файл байт указывается аргументом метода. Методневозвращаетникакого результата. Методыclose(), read(),write()могут выбрасывать необрабатываемое исключение IOException.

Пример: считать из текстового файлаishod.txtинформацию, записанную в нем, и переписать ее в файлresult.txt, заменяя пробелы символами подчеркивания. Исходный файл имеет вид:

Среди миров, в мерцании светил,

Одной звезды я повторяю имя,

Не потому, чтоб я ее любил,

А потому, что я томлюсь с другими.

Иннокентий Анненский

Код программы:

package javaapplicationfile;