Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_java_2_semtcnh.doc
Скачиваний:
2
Добавлен:
22.09.2019
Размер:
425.98 Кб
Скачать

Класс StreamTokenizer

Класс StreamTokenizer для разбора входных потоков. Если нужно создаеть приложение, предназначенное для обработки текстов (например, транслятор или просто разборщик файла конфигурации, содержащего значения различных параметров), может пригодиться класс StreamTokenizer. Создав объект этого класса для входного потока, можно легко решить задачу выделения из этого потока отдельных слов, символов, чисел и строк комментариев.

Экземпляр StreamTokenizer создается на основе существующего объекта, либо InputStream, либо Reader.

Как и java.util.StringTokenizer, этот класс позволяет разбивать данные на лексемы (token), выделяемые из потока по определенным свойствам для выполнения простейшего лексического анализа.

Конструктор

public StreamTokenizer(InputStream istream); В качестве параметра этому конструктору необходимо передать ссылку на заранее созданный входной поток.

Методы

--nextToken() распознавая следующую лексему возвращает ее тип(поле ttype):

Этот метод может вернуть одно из следующих значений:

--TT_WORD – слово (сохраняется в поле sval)

--TT_NUMBER – число ( double nval)

--TT_EOL-конец строки

--TT_EOF-конец файла

В классе StreamTokenizer определено три поля:

public String sval;

public double nval;

public int ttype;

Если метод nextToken вернул значение TT_WORD, в поле sval содержится извлеченный элемент в виде текстовой строки. В том случае, когда из входного потока было извлечено числовое значение, оно будет храниться в поле nval типа double. Обычные символы записываются в поле ttype.

Заметим, что если в потоке обнаружены слова, взятые в кавычки, то символ кавычки записывается в поле ttype, а слова - в поле sval. По умолчанию используется символ кавычек '"', однако с помощью метода quoteChar вы можете задать любой другой символ.

-- public int lineno()-определить номер текущей строки

-- public String toString()-возвращает текстовую строку, представляющую текущий элемент, выделенный из потока

-- public void pushBack()-После вызова метода pushBack следующий вызов метода nextToken приведет к тому, что в поле ttype будет записано текущее значение, а содержимое полей sval и nval не изменится.

Пример: суммирование чисел входного потока.

Static double sumStream (InputStream

in) throws IOException {

StreamTokenizer nums = new

StreamTokenizer (in);

double result = 0.0;

while (nums.nextToken( ) ==

StreamTokenizer.TT_NUMBER)

result += nums.nval;

return result;}

Классы Reader и Writer.

Классы Reader и Writer работают с потоками символов (char). Только, чтение массива символов в Reader описывается методом read(char[]), а запись в Writer – write(char[]).

Класс Reader. Служит базовым классом в иерархии. Имеет точно такие же методы, как и класс InputStream.

Класс FileReader. Имеет два основных конструктора, позволяющих открыть файл:

public FileReader(File file) throws FileNotFoundException

public FileReader(String name) throws FileNotFoundException

Больше никаких "своих" возможностей не имеет, все остальное он наследует от своих предков.

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

public String readLine() throws IOException

Этот метод позволяет читать строку из входного потока. В комбинации с другими классами Java этот метод позволяет организовать ввод с разбиением на слова, вводить числа и т.д.

Обратимся к документации по классу BufferedReader и обратим внимание на его конструкторы. Основной из них это:

public BufferedReader(Reader in)

Т.е. сам по себе этот класс использовать нельзя - только в комбинации с другим классом, например с FileReader.

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

BufferedReader in = new BufferedReader(new FileReader("myfile.txt"));

Типичный пример чтения строки из файла:

String line;

line = in.readLine();

Это наиболее важные классы иерархии Reader. Но для полноты картины рассмотрим и другие классы этой иерархии.

Класс PushbackReader. Позволяет возвращать обратно в поток прочитанную информацию (или любую другую) так, что при следующем чтении будет читаться эта возвращенная в поток информация. Это не означает, что мы, скажем, модифицируем читаемый файл. Все модификации производятся во внутреннем буфере данного класса. Кстати, размер этого буфера ограничен и задается в конструкторе класса.

Класс InputStreamReader. Это вспомогательный класс-переходник от иерархии InputStream к иерархии Reader.

Класс PipedReader. Используется для связи программ друг с другом при помощи каналов (pipes).

Класс StringReader. Обеспечивает работу по чтению информации из строки при помощи средств, предусмотренных иерархией Reader.

Как и в случае с иерархией Reader иерархия Writer сама по себе ничего не добавляет к функциональности иерархии OutputStream и отличается от нее всего несколькими нюансами.

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

Практическое использование иерархии Writer Основным способом создания потока вывода в файл является

PrintWriter fout = new PrintWriter(

new BufferedWriter(new FileWriter(имя_файла)));

После создания такого потока в него можно выводить информацию при помощи методов print и println .

Класс File

Класс File – это вспомогательный инструмент, призванный обеспечить работу с файлами и каталогами. Объект класса File является абстрактным представлением файла и пути к нему. Он устанавливает только соответствие с ним, при этом для создания объекта неважно, существует ли такой файл на диске. Поток может быть – массивом, файлом, строкой.

Создание объекта класса File

Констукторы:

--public File(String path)- параметр –имя файла или путь файла, т.е. строка

--public File(File dir, String name)-создается директория, где хранится файл и имя файла

--public File(String path, String name)- директория задается объектом типа файл, также задается имя файла

Пример как создать объект класса File для файла c:\autoexec.bat и каталога d:\winnt:

f1 = new File("c:\\autoexec.bat");

f2 = new File("d:\\winnt");

Методы:

1.canRead(), canWrite()-возвращается boolean, позволяют проверить возможность чтения из файла и записи в файл

2. getName()- возвращает строку – имя файла (или каталога)

3.getParent(), getParentName()- возвращает каталог, где файл хранится в виде строки названия и объекты File, соответственно

4.getPath()-возвращает путь к файлу

5.isAbsolutely()-возвращает boolean значение, является ли абсолютным путь, которым указан файл

6. isDirecrory(), isFile()-возвращают boolean значение, указывает ли объект на каталог или файл, соответственно

7. isHidden()-возвращает boolean значение,указывает ли объект на скрытый файл

8.LastModified()-дата последнего изменения

9.length()-длина файла в байтах

10.setReadOnly(),setLastModified()

11.createNewFile,mkDir,mkDirs. Соотвестсвенно, createNewFile создает пустой файл(если таковой еще не существует), mkDir()-создает каталог, если для него все родительские уже существуют, mkDirs()-создает каталог вместе со всеми родительскими.

12.public String[] list()-список файлов в каталоге

13.public File[] listFiles()-список файлов в каталоге

14. delete(), deleteOnExit()

Пример. Вывести список файлов в каталоге

import java.io.*;

public class DirList {

public static void main(String[] args) { File dir = new File(args[0]);

if ( dir.isDirectory() ) {

String[] files = dir.list( );

for(int i = 0; i < files.length; i++)

System.out.println(files [i]); }}}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]