Top-office11.ru

IT и мир ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Streamtokenizer java как работает

Java.io.StreamTokenizer класс в Java | Комплект 1

Класс Java.io.StreamTokenizer разбирает входной поток на «токены». Он позволяет читать по одному токену за раз. Stream Tokenizer может распознавать числа, строки в кавычках и различные стили комментариев.
Декларация:

Конструктор:
StreamTokenizer (Reader arg): создает токенизатор, который анализирует данный поток символов.

Методы:

java.io.StreamTokenizer.commentChar (int arg) игнорирует все символы от однострочного символа комментария до конца строки этим StreamTokenizer.
Синтаксис:

Реализация :

// Java-программа, иллюстрирующая использование метода commentChar ()

public class NewClass

public static void main(String[] args) throws InterruptedException,

FileReader reader = new FileReader( «ABC.txt» );

BufferedReader bufferread = new BufferedReader(reader);

StreamTokenizer token = new StreamTokenizer(bufferread);

// Использование метода commentChar ()

while ((t = token.nextToken()) != StreamTokenizer.TT_EOF)

System.out.println( «Number : » + token.nval);

System.out.println( «Word : » + token.sval);

Замечания :
Эта программа не будет работать здесь, так как не существует файла ‘ABC’. Вы можете проверить этот код на компиляторе Java в вашей системе.
Чтобы проверить этот код, создайте файл «ABC» в вашей системе.
Файл ‘ABC’ содержит:

Программисты
1
2
3
Geeks
Здравствуйте
Программу здесь объясняют мои друзья.

Выход:

lineno (): java.io.StreamTokenizer.lineno () возвращает номер текущей строки этого StreamTokenizer.
Синтаксис:

Реализация :

// Java-программа, иллюстрирующая использование метода lineno ()

public class NewClass

public static void main(String[] args) throws InterruptedException,

FileReader reader = new FileReader( «ABC.txt» );

BufferedReader bufferread = new BufferedReader(reader);

StreamTokenizer token = new StreamTokenizer(bufferread);

// Использование метода lineno ()

// чтобы получить номер текущей строки

System.out.println( «Line Number:» + token.lineno());

while ((t = token.nextToken()) != StreamTokenizer.TT_EOF)

System.out.println( «Line No. : » + token.lineno());

System.out.println( «Number : » + token.nval);

System.out.println( «Word : » + token.sval);

Выход:

toString (): java.io.StreamTokenizer.toString () представляет текущий токен Stream в виде строки вместе с его строкой no.
Синтаксис:

Реализация :

// Java-программа, иллюстрирующая использование метода toString ()

public class NewClass

public static void main(String[] args) throws InterruptedException,

FileReader reader = new FileReader( «ABC.txt» );

BufferedReader bufferread = new BufferedReader(reader);

StreamTokenizer token = new StreamTokenizer(bufferread);

while ((t = token.nextToken()) != StreamTokenizer.TT_EOF)

// Значение поля ttype, возвращаемого nextToken ()

System.out.println( «Number : » + token.nval);

// Значение поля ttype, возвращаемого nextToken ()

// Использование метода toStringn ()

System.out.println( «Word : » + token.toString());

Выход:

eolIsSignificant (): java.io.StreamTokenizer.eolIsSignificant (логический аргумент) указывает, следует ли обрабатывать конец строки как токен или нет. Если «arg» истинно, то конец строки считается токеном. Если true, то метод возвращает TT_EOL и устанавливает поле ttype при достижении конца строки.
Если ‘arg’ ложно, то конец строки рассматривается просто как пробел.
Синтаксис:

Реализация :

// Java-программа, иллюстрирующая использование метода eolIsSignificant ()

public class NewClass

public static void main(String[] args) throws InterruptedException,

FileReader reader = new FileReader( «ABC.txt» );

BufferedReader bufferread = new BufferedReader(reader);

StreamTokenizer token = new StreamTokenizer(bufferread);

boolean arg = true ;

// Использование метода eolIsSignificant ()

// Здесь ‘arg’ установлен в true, поэтому EOL рассматривается как токен

while ((t = token.nextToken()) != StreamTokenizer.TT_EOF)

System.out.println( «End of Line encountered.» );

System.out.println( «Number : » + token.nval);

System.out.println( «Word : » + token.sval);

Замечания :
Эта программа не будет работать здесь, так как не существует файла ‘ABC’. Вы можете проверить этот код на компиляторе Java в вашей системе.
Чтобы проверить этот код, создайте файл «ABC» в вашей системе.
Файл ‘ABC’ содержит:

Выход :

nextToken (): java.io.StreamTokenizer.nextToken () анализирует следующий токен из входного потока и возвращает его значение в поле ttype вместе с дополнительными полями, такими как ‘sval’, ‘nval’.
Синтаксис:

Реализация :

// Java-программа, иллюстрирующая использование метода nextToken ()

public class NewClass

public static void main(String[] args) throws InterruptedException,

FileReader reader = new FileReader( «ABC.txt» );

BufferedReader bufferread = new BufferedReader(reader);

StreamTokenizer token = new StreamTokenizer(bufferread);

// Использование метода nextToken () для анализа следующего токена из входного потока

int t = token.nextToken();

while ((t = token.nextToken()) != StreamTokenizer.TT_EOF)

System.out.println( «Number : » + token.nval);

System.out.println( «Word : » + token.sval);

Замечания :
Эта программа не будет работать здесь, так как не существует файла ‘ABC’. Вы можете проверить этот код на компиляторе Java в вашей системе.
Чтобы проверить этот код, создайте файл «ABC» в вашей системе.
Файл ‘ABC’ содержит:

1
Эта программа рассказывает
2
об использовании
3
следующий метод token ()

Выход :

lowerCaseMode (): java.io.StreamTokenizer.lowerCaseMode (логическое значение arg) указывает, следует ли автоматически вводить строчные буквы для токенов слова или нет. Если флаг — ‘arg’ установлен в true, то значение поля ‘sval’ уменьшается.
Синтаксис:

Реализация :

// Java-программа, иллюстрирующая использование метода lowerCaseMode ()

public class NewClass

public static void main(String[] args) throws InterruptedException,

FileReader reader = new FileReader( «ABC.txt» );

BufferedReader bufferread = new BufferedReader(reader);

StreamTokenizer token = new StreamTokenizer(bufferread);

/ * Использование метода lowerCaseMode () для

Здесь мы включили режим нижнего регистра

boolean arg = true ;

while ((t = token.nextToken()) != StreamTokenizer.TT_EOF)

System.out.println( «Number : » + token.nval);

System.out.println( «Word : » + token.sval);

Замечания :
Эта программа не будет работать здесь, так как не существует файла ‘ABC’. Вы можете проверить этот код на компиляторе Java в вашей системе.
Чтобы проверить этот код, создайте файл «ABC» в вашей системе.
Файл ‘ABC’ содержит:

Привет гики
Речь идет о
LowerCaseMode ()

Выход :

commonChar (): java.io.StreamTokenizer.ndomChar (int arg) устанавливает символ ‘arg’ как обычный символ. Он удалит символ arg, если он имеет какое-либо значение в виде слова, числа, пробела или символа комментария.
Синтаксис:

Читать еще:  Java math pow

Реализация :

// Java-программа, иллюстрирующая использование метода normalChar ()

public class NewClass

public static void main(String[] args) throws InterruptedException,

FileReader reader = new FileReader( «ABC.txt» );

BufferedReader bufferread = new BufferedReader(reader);

StreamTokenizer token = new StreamTokenizer(bufferread);

// Использование метода normalChar ()

// Здесь мы взяли ‘s’ как обычный символ

while ((t = token.nextToken()) != StreamTokenizer.TT_EOF)

System.out.println( «Number : » + token.nval);

System.out.println( «Word : » + token.sval);

Замечания :
Эта программа не будет работать здесь, так как не существует файла ‘ABC’. Вы можете проверить этот код на компиляторе Java в вашей системе.
Чтобы проверить этот код, создайте файл «ABC» в вашей системе.
Файл ‘ABC’ содержит:

Привет гики
Thissss Issszz О
ordinaryChar ()

Этот метод удаляет ‘s’ из всего потока

Выход :

normalChars (): java.io.StreamTokenizer.ndomChars (int low, int high) устанавливает символ в диапазоне — от «a до b» обычному символу в StreamTokenizer
Синтаксис:

Реализация :

// Java-программа, иллюстрирующая использование метода normalChars ()

public class NewClass

public static void main(String[] args) throws InterruptedException,

FileReader reader = new FileReader( «ABC.txt» );

BufferedReader bufferread = new BufferedReader(reader);

StreamTokenizer token = new StreamTokenizer(bufferread);

// Использование метода normalChars ()

// Здесь мы взяли low = ‘a’ и high = ‘c’

token.ordinaryChars( ‘a’ , ‘c’ );

while ((t = token.nextToken()) != StreamTokenizer.TT_EOF)

System.out.println( «Number : » + token.nval);

System.out.println( «Word : » + token.sval);

Замечания :
Эта программа не будет работать здесь, так как не существует файла ‘ABC’. Вы можете проверить этот код на компиляторе Java в вашей системе.
Чтобы проверить этот код, создайте файл «ABC» в вашей системе.
Файл ‘ABC’ содержит:

Привет гики
Эта
является
около
ordinaryChars ()

Выход :

Эта статья предоставлена Мохит Гупта . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Streamtokenizer java как работает

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

Конструктор класса StreamTokenizer

Для создание объектов класса StreamTokenizer предусмотрен всего один конструктор:

В качестве параметра этому конструктору необходимо передать ссылку на заранее созданный входной поток.

Методы класса StreamTokenizer

Для настройки параметров разборщика StreamTokenizer и получения отдельных элементов входного потока вы должны пользоваться методами, определенными в классе StreamTokenizer. Рассмотрим самые важние из них.

Методы для настройки параметров разборщика

Ниже мы привели прототипы методов, предназначенных для настройки параметров разборщика:

Несколько методов определяют, будет ли разборщик выделять во входном потоке строки комментария и если будет, то какми образом.

С помощью метода commentChar вы можете указать символ комментария. Если в строке входного потока попадется такой символ, то он и все следующие за ним до конца текущей строки символы будут проигнорированы.

Методы SlashSlashComments и slashStarComments позволяют указать, что для входного текста используются разделители комментариев в виде двойного символа ‘/’ и ‘/* … */’, соответственно. Это соответствует способу указания комментариев в программах, составленных на языках программирования С++ и С. Для включения режима выделения комментариев обоим методам в качетстве параметра необходимо передать значение true, а для отключения — false.

Метод quoteChar позволяет задать символ, который будет использован в качестве кавычек. Когда при разборе потока встречаются слова, взятые в кавычки, они возвращаются программе разбора без кавычек.

Если передать методу eolIsSignificant значение true, разделители строк будут интерпретироваться как отдельные элементы. Если же этому методу передать значение false, разделители строк будут использоваться аналогично пробелам для разделения элементов входного потока.

Метод lowerCaseMode позволяет включить режим, при котором все выделенные элементы будут перекодированы в строчные символы.

Методы ordinaryChar и ordinaryChars позволяют указать символы, которые должны интерпретироваться как обычные, из которых составляются слова или цифры. Например, если передать методу ordinaryChar символ ‘.’, то слово java.io будет восприниматься как один элемент. Если же этого не сделать, то разборщик выделит из него три элемента — слово java, точку ‘.’ и слово io. Метод ordinaryChars позволяет указать диапазон значений символов, которые должны интерпретироваться как обычные.

С помощью метода resetSyntax вы можете указать, что все символы будут рассматриваться, как обычные.

Метод parseNumbers включает режим разбора чисел, при котором распознаются и преобразуются числа в формате с плавающей десятичной точкой.

Метод whitespaceChars задает диапазон значений для символов-разделителей отдельных слов в потоке.

Метод wordChars позволяет указать символы, которые являются составными частями слов.

Методы для разбора входного потока

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

Читать еще:  Java nio charset malformedinputexception

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

ЗначениеОписание
TT_WORDTT_WORDИз потока было извлечено слово
TT_NUMBERTT_NUMBERИз потока было извлечено численное значение
TT_EOLTT_EOLОбнаружен конец строки. Это значение возвращается только в том случае, если при настройке параметров разборщика был вызван метод eolIsSignficant
TT_EOFTT_EOFОбнаружен конец файла

Если метод nextToken вернул значение TT_EOF, следует завершить цикл разбора входного потока.

Как извлечь считанные элементы потока?

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

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

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

При необходимости в процессе разбора вы можете определить номер текущей строки, вызвав для этого метод lineno:

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

Метод toString возвращает текстовую строку, представляющую текущий элемент, выделенный из потока:

Класс StreamTokenizer

Экземпляр StreamTokenizer создается поверх существующего объекта, либо InputStream, либо Reader. Как и java.util.StringTokenizer, этот класс позволяет разбивать данные на лексемы (token), выделяемые из потока по определенным свойствам. Поскольку работа ведется со словами, конструктор, принимающий InputStream, объявлен как deprecated (предлагается оборачивать байтовый поток классом InputStreamReader и вызывать второй конструктор). Общий принцип работы такой же, как и у StringTokenizer, – задаются параметры разбиения, после чего вызывается метод nextToken(), пока не будет достигнут конец потока. Способы задания разбиения у StreamTokenizer довольно разнообразны, но просты, и поэтому здесь не рассматриваются.

Работа с файловой системой

Класс File

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

Объект класса File является абстрактным представлением файла и пути к нему. Он устанавливает только соответствие с ним, при этом для создания объекта неважно, существует ли такой файл на диске. После создания можно выполнить проверку, вызвав метод exists, который возвращает значение true, если файл существует. Создание или удаление объекта класса File никоим образом не отображается на реальных файлах. Для работы с содержимым файла можно получить экземпляры FileI/OStream.

Объект File может указывать на каталог (узнать это можно путем вызова метода isDirectory ). Метод list возвращает список имен (массив String ) содержащихся в нем файлов (если объект File не указывает на каталог – будет возвращен null ).

Следующий пример демонстрирует использование объектов класса File:

При выполнении этой программы на экран будут выведены названия (в каноническом виде) всех файлов, с расширением .java, содержащихся в текущем каталоге и всех его подкаталогах.

Для определения того, что файл имеет расширение .java, использовался интерфейс FileFilter с реализацией в виде внутреннего класса NameFilter. Интерфейс FileFilter определяет только один метод accept, возвращающий значение, определяющее, попадает ли переданный файл в условия фильтрации. Помимо этого интерфейса, существует еще одна разновидность интерфейса фильтра – FilenameFilter, где метод accept определен несколько иначе: он принимает не объект файла к проверке, а объект File, указывающий на каталог, где находится файл для проверки, и строку его названия. Для проверки совпадения, с учетом регулярных выражений, нужно соответствующим образом реализовать метод accept. В конкретном приведенном примере можно было обойтись и без использования интерфейсов FileFilter или FilenameFilter. На практике их можно использовать для вызова методов list объектов File – в этих случаях будут возвращены файлы с учетом фильтра.

Также класс File предоставляет возможность получения некоторой информации о файле.

  • Методы canRead и canWrite – возвращается boolean значение, можно ли будет приложению производить чтение и изменение содержимого из файла, соответственно.
  • getName – возвращает строку – имя файла (или каталога).
  • getParent, getParentName – возвращают каталог, где файл находится в виде объекта и строки названия File, соответственно.
  • getPath – возвращает путь к файлу (при этом в строку преобразуется абстрактный путь, на который указывает объект File ).
  • isAbsolutely – возвращает boolean значение, является ли абсолютным путь, которым указан файл. Определение, является ли путь абсолютным, зависит от системы, где запущена Java-машина. Так, для Windows абсолютный путь начинается с указания диска, либо символом ». Для Unix абсолютный путь начинается символом ‘/’.
  • isDirectory, isFile – возвращает boolean значение, указывает ли объект на каталог либо файл, соответственно.
  • isHidden – возвращает boolean значение, указывает ли объект на скрытый файл.
  • lastModified – дата последнего изменения.
  • length – длина файла в байтах.

Также можно изменить некоторые свойства файла – методы setReadOnly, setLastModified, назначение которых очевидно из названия. Если нужно создать файл на диске, это позволяют сделать методы createNewFile, mkDir, mkDirs. Соответственно, createNewFile создает пустой файл (если таковой еще не существует), mkDir создает каталог, если для него все родительские уже существуют, а mkDirs создаст каталог вместе со всеми необходимыми родительскими.

Читать еще:  Разработка приложений на javascript

Файл можно и удалить – для этого предназначены методы delete и deleteOnExit. При вызове метода delete файл будет удален сразу же, а при вызове deleteOnExit по окончании работы Java-машины (только при корректном завершении работы) отменить запрос уже невозможно.

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

Gu >Last modified: October 17, 2019

I just announced the new Learn Spring course, focused on the fundamentals of Spring 5 and Spring Boot 2:

In the 9 years of running Baeldung, I’ve never, ever done a «sale».
But. we’ve also not been through anything like this pandemic either.
And, if making my courses more affordable for a while is going to help a company stay in business, or a developer land a new job, make rent or be able to provide for their family — then it’s well worth doing.
Effective immediately, all Baeldung courses are 33% off their normal prices!
You’ll find all three courses in the menu, above, or here.

1. Introduction

In this tutorial, we’ll show how to parse a stream of characters into tokens using the Java StreamTokenizer class.

2. StreamTokenizer

The StreamTokenizer class reads the stream character by character. Each of them can have zero or more of the following attributes: white space, alphabetic, numeric, string quote or comment character.

Now, we need to understand the default configuration. We have the following types of characters:

  • Word characters: ranges like ‘a’ to ‘z’ and ‘A’ to ‘Z
  • Numeric characters: 0,1,…,9
  • Whitespace characters: ASCII values from 0 to 32
  • Comment character: /
  • String quote characters: ‘ and “

Note that the ends of lines are treated as whitespaces, not as separate tokens, and the C/C++-style comments are not recognized by default.

This class possesses a set of important fields:

  • TT_EOF – A constant indicating the end of the stream
  • TT_EOL – A constant indicating the end of the line
  • TT_NUMBER – A constant indicating a number token
  • TT_WORD – A constant indicating a word token

3. Default Configuration

Here, we’re going to create an example in order to understand the StreamTokenizer mechanism. We’ll start by creating an instance of this class and then call the nextToken() method until it returns the TT_EOF value:

The test file simply contains:

Now, if we printed out the contents of the array, we’d see:

In order to better understand the example, we need to explain the StreamTokenizer.ttype, StreamTokenizer.nval and StreamTokenizer.sval fields.

The ttype field contains the type of the token just read. It could be TT_EOF, TT_EOL, TT_NUMBER, TT_WORD. However, for a quoted string token, its value is the ASCII value of the quote character. Moreover, if the token is an ordinary character like ‘!’, with no attributes, then the ttype will be populated with the ASCII value of that character.

Next, we’re using sval field to get the token, only if it’s a TT_WORD, that is, a word token. But, if we’re dealing with a quoted string token – say “lazy” – then this field contains the body of the string.

Last, we’ve used the nval field to get the token, only if it’s a number token, using TT_NUMBER.

4. Custom Configuration

Here, we’ll change the default configuration and create another example.

First, we’re going to set some extra word characters using the wordChars(int low, int hi) method. Then, we’ll make the comment character (‘/’) an ordinary one and promote ‘#’ as the new comment character.

Finally, we’ll consider the end of the line as a token character with the help of the eolIsSignificant(boolean flag) method.

We only need to call these methods on the streamTokenizer object:

And here we have a new output:

Note that the double quotes became part of the token, the newline character is not a whitespace character anymore, but an ordinary character, and therefore a single-character token.

Also, the characters following the ‘#’ character are now skipped and the ‘/’ is an ordinary character.

We could also change the quote character with the quoteChar(int ch) method or even the whitespace characters by calling whitespaceChars(int low, int hi) method. Thus, further customizations can be made calling StreamTokenizer‘s methods in different combinations.

5. Conclusion

In this tutorial, we’ve seen how to parse a stream of characters into tokens using the StreamTokenizer class. We’ve learned about the default mechanism and created an example with the default configuration.

Finally, we’ve changed the default parameters and we’ve noticed how flexible the StreamTokenizer class is.

As usual, the code can be found over on GitHub.

Ссылка на основную публикацию
Adblock
detector