Есть ли у сканера буфер java

Обновлено: 05.07.2024

насколько я знаю, два наиболее распространенных метода чтения символьных данных из файла на Java используют Scanner или BufferedReader . Я также знаю, что BufferedReader эффективно считывайте файлы с помощью буфера, чтобы избежать операций на физическом диске. Мои вопросы:

  • тут Scanner выполняет, а также BufferedReader ?
  • почему бы вам выбрать Scanner над BufferedReader или наоборот?

Scanner используется для разбора токенов из содержимого потока while BufferedReader просто считывает поток и не делает никакого специального разбора.

на самом деле вы можете пройти BufferedReader до scanner в качестве источника символов для анализа.

в настоящее время последний релиз JDK6/build (b27), the Scanner имеет меньший буфер (1024 символов) в отличие от BufferedReader (8192 chars), но этого более чем достаточно.

что касается выбора, используйте Scanner Если вы хотите парсить файл, используйте BufferedReader Если вы хотите читать файл строка за строкой. Также см. вводный текст их aforelinked API документации.

  • извлечение = интерпретация данного ввода как токенов (частей). Он может вернуть вам определенные части непосредственно как int, string, decimal и т. д. Смотрите также все те nextXxx() методы Scanner класса.
  • чтение = немой потоковой передачи. Он продолжает возвращать вам все символы, которые вы, в свою очередь, должны вручную проверить, хотите ли вы сопоставить или составить что-то полезное. Но если тебе все равно не нужно этого делать . , тогда достаточно чтения.

посмотреть этот ссылке, оттуда цитируется следующее:

BufferedReader-это простой класс, предназначенный для эффективного чтения из подчиненного потока. Как правило, каждый запрос чтения читателя как FileReader вызывает соответствующий запрос на чтение основной поток. Каждый вызов read () или readLine() может заставить байты считываться из файла, преобразовываться в символы и затем возвращается, что может быть очень неэффективно. Эффективность улучшена заметно, если читатель искривлен в BufferedReader.

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

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

сканер, однако, не является потокобезопасным, он должен быть внешним синхронизированный.

выбор использования BufferedReader или сканера зависит от кода вы пишете, если вы пишете простой Буферизованный log reader читатель адекватен. Однако, если вы пишу сканер анализатора XML это более естественный выбор.

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

BufferedReader имеет значительно большую буферную память, чем сканер. Использовать BufferedReader Если вы хотите получить длинные строки из потока, и использовать Scanner Если вы хотите проанализировать определенный тип токена из потока.

Scanner можно использовать tokenize с помощью пользовательского разделителя и анализировать поток в примитивные типы данных, в то время как BufferedReader можно только читать и хранить строку.

BufferedReader это синхронно в то время как Scanner нет. Использовать BufferedReader Если вы работаете с несколькими потоками.

Scanner скрывает IOException в то время как BufferedReader сразу же бросает его.

Я предлагаю использовать BufferedReader для чтения текста. Scanner скрывает IOException пока BufferedReader сразу же бросает его.

  • BufferedReader это синхронно в то время как Scanner нет.
  • BufferedReader следует использовать, если мы работаем с несколькими потоками.
  • BufferedReader имеет значительно большую буферную память, чем Scanner .
  • на Scanner имеет небольшой буфер (буфер 1Kb char) в отличие от BufferedReader (8kb байтовый буфер), но этого более чем достаточно.
  • BufferedReader немного быстрее по сравнению с Scanner , потому что Scanner делает парсинг входных данных и BufferedReader просто считывает последовательность характеров.

на сканер класс является дополнением Formater класса (используется для преобразования двоичных данных в форматированный текст). Сканер считывает форматированный ввод и преобразует его в двоичную форму. Хотя всегда можно было прочитать форматированный ввод, это потребовало больше усилий, чем большинство программистов предпочли бы. Из-за добавления блока развертки, теперь легко прочитать все типы числовых значений, строк и других типов данных, приходит ли оно от файла диска, клавиатура или другой источник. Сканер может использоваться для чтения входных данных из консоли, файла, строки или любого другого источника, реализующего читаемый интерфейс или ReadableByteChannel. Например, с помощью сканера можно прочитать число с клавиатуры и присвоить его значение переменной.

командой bufferedreader, С другой стороны, является классом ввода-вывода символьного потока. Символьные потоки обеспечивают удобный способ ввода и вывода с точки зрения символов (Unicode). BufferedReader в основном используется для ввода данных с консоли, System.in . Требуется InputStreamReader объект в качестве аргумента.

Основные Отличия:

  1. сканер
  • простой текстовый сканер, который может анализировать примитивные типы и строки с помощью регулярных выражений.
  • сканер разбивает входные данные на маркеры с помощью шаблона разделителя, который по умолчанию соответствует пробелам. Полученные токены затем могут быть преобразованы в значения разных типов с помощью различных next методы.

выводит следующий вывод:

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

командой bufferedreader:

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

может быть указан размер буфера или использоваться размер по умолчанию. Значение по умолчанию достаточно велико для большинства целей.

В общем случае каждый запрос чтения, сделанный из считывателя, вызывает соответствующий запрос чтения базового символа или потока байтов. Поэтому рекомендуется обернуть BufferedReader вокруг любого читателя, операции read() которого могут быть дорогостоящими, например FileReaders и InputStreamReaders. Например,

будет буферизировать входные данные из указанного файла. Без буферизации каждый вызов read() или readLine () может привести к считыванию байтов из файла, преобразованию в символы, а затем возвращению, что может быть очень неэффективным. Программы, использующие DataInputStreams для текстового ввода, можно локализовать, заменив каждый DataInputStream соответствующим Командой bufferedreader.

Ниже приведены различия между BufferedReader и Scanner

  1. BufferedReader только считывает данные, но сканер также анализирует данные.
  2. вы можете читать только строку с помощью BufferedReader, но вы можете читать int, long или float с помощью сканера.
  3. BufferedReader старше от сканера, он существует из jdk 1.1 в то время как Сканер был добавлен в выпуск JDK 5.
  4. размер буфера BufferedReader большой(8KB) по сравнению с 1KB из Сканер.
  5. BufferedReader больше подходит для чтения файла с длинной строкой пока блок развертки более соответствующ для чтения малого входного сигнала потребителя от командная строка.
  6. BufferedReader синхронизирован, но сканер-нет, что означает, что вы нельзя делить сканер между несколькими потоками.
  7. BufferedReader быстрее, чем сканер, потому что он не тратит время на разбор
  8. BufferedReader немного быстрее по сравнению со сканером
  9. командой bufferedreader это с Явы.пакет io и сканер от java.пакет утиль на основании пунктов мы можем выбрать наш выбор.

разницу между командой bufferedreader и сканер следующие:

  1. BufferedReader является синхронизироваться но сканер не синхронизируется.
  2. BufferedReader является thread safe но сканер не потокобезопасными.
  3. командой bufferedreader имеет большую буферную память но сканер имеет меньшую буферную память.
  4. командой bufferedreader это быстрее но сканер замедление в исполнении.

код для чтения строки из консоли:

командой bufferedreader:

сканер:

существуют различные способы ввода в java, такие как:

1) BufferedReader 2) Сканер 3) Аргументы Командной Строки

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

где сканер-это простой текстовый сканер, который может анализировать примитивные типы и строки с помощью регулярных выражений.

Если вы пишете простой читатель журнала Буферизованный читатель адекватен. если вы пишете сканер синтаксического анализатора XML, это более естественный выбор.

для получения дополнительной информации, пожалуйста, обратитесь:

при чтении ввода с консоли существует два варианта для достижения этого. Первое использование Scanner , используя BufferedReader . У обоих разные характеристики. Это означает различия в том, как его использовать.

сканер обрабатывается как токен. BufferedReader просто читает строку за строкой, заданную как строка. Сканер IT self обеспечивает возможности синтаксического анализа только как nextInt(), nextFloat().

но, что есть другие отличия?

  • сканер обрабатывается как токен. BufferedReader как строка/строка потока
  • сканер размечается с учетом ввода с помощью regex. Используя командой bufferedreader должны писать дополнительный код
  • BufferedReader быстрее, чем сканер *точка нет. 2
  • сканер не синхронизирован, BufferedReader синхронизирован

сканер поставляется с версией JDK 1.5 выше.

когда следует использовать сканер, или Буферизованный читатель?

рассмотрим основные различия между ними, с помощью маркера, используя другие линии потока. Когда вам нужны возможности синтаксического анализа, используйте Scanner вместо этого. Но мне более комфортно с BufferedReader. Когда вам нужно прочитать из файла, используйте BufferedReader, потому что он использует буфер при чтении файла. Или вы можете использовать BufferedReader в качестве входа в сканер.

листинг несколько.

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

Java.io.BufferedReader класс считывает текст из потока ввода символов, буферизуя символы, чтобы обеспечить эффективное чтение последовательности символов

1) BufferedReader происходит синхронно, а Scanner нет. BufferedReader должно быть использовано если мы работаем с различные потоки.

2) BufferedReader имеет значительно большую буферную память, чем Scanner . The Scanner имеет небольшой буфер (буфер 1Kb char) в отличие от BufferedReader (8kb байтовый буфер), но этого более чем достаточно.

3) BufferedReader немного быстрее по сравнению с Scanner , потому что Scanner делает разбор входных данных и BufferedReader просто читает последовательность символов.

  1. BufferedReader, вероятно, даст вам лучшую производительность (потому что сканер основан на inputstreamreader, посмотрите источники). ups, для чтения из файлов он использует nio. Когда я тестировал производительность nio против производительности BufferedReader для больших файлов, nio показывает немного лучшую производительность.
  2. для чтения из файла попробуйте Apache Commons IO.

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

Класс Scanner - 1

Привет! Наше сегодняшнее занятие будет особенным! До этого при решении задач и написании программ алгоритм был простым: мы пишем какой-то код, запускаем метод main() , программа делает то, что от нее требуется, и завершает свою работу. Но теперь всё изменится! Сегодня мы научимся по-настоящему взаимодействовать с программой: мы научим её реагировать на наши действия! Возможно, ты уже понял, к чему мы клоним. Эту лекцию посвятим подробному разбору одного из классов языка Java – Scanner. Этот класс пригодится, если тебе нужно будет считывать данные, которые вводят юзеры. Перед тем, как мы перейдем к изучению кода, скажи, тебе когда-нибудь приходилось встречаться с таким устройством как сканер? Наверняка да. Изнутри строение сканера достаточно сложное, но суть его работы довольно проста: он считывает те данные, которые пользователь в него вводит (например, паспорт или страховой полис) и сохраняет считанную информацию в памяти (например, в виде изображения). Так вот, сегодня ты создашь свой собственный сканер! С документами он, конечно, не справится, а вот с текстовой информацией — вполне :) Поехали!

Java Scanner Class

Класс Scanner - 2

Первое и главное, с чем нам нужно познакомиться, — класс java.util.Scanner . Его функциональность очень проста. Он, словно настоящий сканер, считывает данные из источника, который ты для него укажешь. Например, из строки, из файла, из консоли. Далее он распознает эту информацию и обрабатывает нужным образом. Приведем самый простой пример: Мы создали объект сканера и указали для него источник данных (строку с текстом). Метод nextLine() обращается к источнику данных (нашему тексту с четверостишием), находит там следующую строку, которую он еще не считывал (в нашем случае — первую) и возвращает ее. После чего мы выводим ее на консоль: Вывод в консоль: Мы можем использовать метод nextLine() несколько раз и вывести весь кусок поэмы: Каждый раз наш сканер будет делать один шаг вперед и считывать следующую строку. Результат работы программы — вывод в консоль: Как мы уже говорили, источником данных для сканера может быть не только строка, но и, например, консоль. Важная новость для нас: если раньше мы только выводили туда данные, теперь будем вводить данные с клавиатуры! Посмотрим, что еще умеет класс Scanner: Метод nextInt() считывает и возвращает введенное число. В нашей программе он используется для того, чтобы присвоить значение переменной number . Это уже больше похоже на настоящий сканер! Программа просит пользователя ввести в строку любое число. После того, как пользователь это сделал, программа благодарит его, выводит на консоль итог своей работы и завершается. Но у нас осталась одна серьезная проблема. Пользователь может ошибиться и ввести что-то не то. Вот пример, когда наша текущая программа перестанет работать: Попробуем ввести вместо числа строку “JavaRush”: Вывод в консоль: Ой-ой, все плохо -_- Во избежание подобных ситуаций нам нужно придумать способ проверки данных, которые вводит пользователь. Например, пользователь вводит что угодно, кроме числа, хорошо бы вывести в консоль предупреждение, что введенная информация не является числом, а если все в порядке — вывести текст подтверждения. Но для этого нам надо фактически “заглянуть в будущее” — узнать, что там дальше в нашем потоке. Умеет ли Scanner в Java это делать? Еще как умеет! И для этого у него есть целая группа методов: hasNextInt() — метод проверяет, является ли следующая порция введенных данных числом, или нет (возвращает, соответственно, true или false). hasNextLine() — проверяет, является ли следующая порция данных строкой. hasNextByte() , hasNextShort() , hasNextLong() , hasNextFloat() , hasNextDouble() — все эти методы делают то же для остальных типов данных. Попробуем изменить нашу программу для чтения числа: Теперь наша программа проверяет, является ли следующий введенный символ числом или нет. И только в случае, если является, выводит подтверждение. Если же ввод не прошел проверку, программа это замечает и просит попробовать снова. По сути, ты можешь общаться с объектом Scanner и заранее узнавать, какой тип данных тебе ожидать. “Эй, сканер, что там дальше будет? Число, строка, или еще что? Число? А какое — int , short , long ?” Такая гибкость дает тебе возможность выстраивать логику своей программы в зависимости от поведения пользователя. Еще один важный метод, на который стоит обратить внимание — useDelimiter() . В этот метод передается строка, которую вы хотите использовать в качестве разделителя. Например, мы неожиданно увлеклись японской поэзией и решили считать с помощью сканера несколько хокку великого поэта Мацуо Басе. Даже если три разных стиха переданы нам одной корявой строкой, мы легко можем их разделить и красиво отформатировать: Мы используем в качестве разделителя строк метод useDelimeter() класса Scanner : он отвечает за деление входящих данных на части. В нашем случае для разделения строк в качестве аргумента передаётся и используется одиночная кавычка ( "'" ). Следующий за этой кавычкой текст отображается на новой строке, так как в цикле while мы используем метод println() класса System для считывания данных. В результате в консоли у нас появится красивый вывод, совсем как в книгах: В этом же примере есть еще один метод, на который нужно обязательно обратить внимание — close() . Как и любой объект, работающий с потоками ввода-вывода, сканер должен быть закрыт по завершении своей работы, чтобы больше не потреблять ресурсы нашего компьютера. Никогда не забывай о методе close() ! Вот и все! Как видишь, класс Scanner достаточно прост в использовании и очень полезен! :)

Насколько мне известно, два наиболее распространенных метода чтения основанных на символах данных из файла в Java используют Scanner или BufferedReader . Я также знаю, что BufferedReader эффективно считывает файлы, используя буфер, чтобы избежать операций с физическим диском. Мои вопросы:

  • Выполняет ли Scanner , а также BufferedReader ?
  • Почему вы выбрали Scanner над BufferedReader или наоборот?
Я обычно также использую сканер для чтения из стандартного в («Scanner in = новый сканер (System.in)» чувствует себя намного чище). Не уверен, что это на самом деле менее эффективно, но поскольку чтение с std in блокирует, я не могу себе представить, что эффективность сканера была бы проблемой.

Scanner используется для разбора токенов из содержимого потока, а BufferedReader просто считывает поток и не выполняет никакого специального разбора.

Фактически вы можете передать BufferedReader в Scanner в качестве источника символов для синтаксического анализа.

BufferedReader синхронизирован, а Scanner - нет, поэтому вам решать. Я знаю, что эта тема старая, но у меня были неоднозначные результаты в операционных системах, использующих BufferedReader, при попытке вырвать содержимое из потоков, предоставляемых Process (т. Е. Захватывать выходные данные внешней команды). Как только я изменил свой код на использование сканера, как отмечалось в отдельном ответе , все стало работать согласованно и как ожидалось. @Reuben Но Scanner конечном счете зависит от чего-то другого для его ввода, который вполне может быть синхронизирован.

В последнем выпуске/сборке JDK6 (b27) у Scanner имеется меньший буфер (1024 символа) в отличие от BufferedReader (8192 символов), но это более чем достаточно.

Что касается выбора, используйте Scanner если вы хотите проанализировать файл, используйте BufferedReader если вы хотите прочитать файл по строкам. Также ознакомьтесь с вступительным текстом их документальных документов API.

  • Parsing= интерпретация данного ввода как токенов (частей). Он способен возвращать вам определенные части непосредственно как int, string, decimal и т.д. См. Также все эти nextXxx() в классе Scanner .
  • Чтение= немой поток. Он продолжает выдавать вам всех персонажей, которые вам, в свою очередь, придется вручную проверять, хотите ли вы совместить или составить что-то полезное. Но если вам все равно не нужно это делать, то чтение достаточно.
Хороший. Спасибо за подсказку буфера. Искал все это время, поскольку родные чтения чрезвычайно дороги. @BalusC, что ты имеешь в виду, анализировать и читать? Извините я в замешательстве @Asif: parsing = интерпретировать данный ввод как токены (части). Он может возвращать вам определенные части непосредственно как int, string, decimal и т. Д. См. Также все эти методы nextXxx () в классе Scanner. Чтение = немой поток Он возвращает вам все символы, которые вы, в свою очередь, должны вручную проверить, хотите ли вы подобрать или составить что-то полезное. Но если вам все равно это не нужно, тогда чтения достаточно. @BalusC Хорошо, я уже использовал, readInt(); readFloat (); и т. д. Теперь получил, что означает анализ. и BalusC, можете ли вы уделить мне немного времени, просто 10 минут в чате, я хочу немного спросить о буферизованном, как это работает. Как мне обернуть BufferedReader в конструктор сканера? Это хорошая идея?

См. ссылку , после чего цитируется следующее:

BufferedReader - простой класс, предназначенный для эффективного чтения из подрывной поток. Как правило, каждый запрос на чтение, сделанный из Reader, как FileReader вызывает соответствующее запрос на чтение для базовый поток. Каждый вызов read() или readLine() может заставить байты считывать из файла, преобразовывать в символы и затем возвращается, что может быть очень неэффективным. Эффективность улучшена заметно, если Reader деформирован в BufferedReader.

BufferedReader синхронизирован, поэтому операции чтения на BufferedReader можно безопасно выполнять несколько потоков.

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

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

Выбор использования BufferedReader или сканера зависит от кода вы пишете, если вы пишете простой бланк журнала Буферизация читатель является адекватным. Однако, если вы пишете синтаксический анализатор XML Scanner является более естественным выбором.

Даже при чтении ввода, если вы хотите принять входную строку пользователя и просто добавьте его в файл, BufferedReader достаточно хорош. С другой стороны, если вы хотите принять ввод пользователя как команду с несколько вариантов, а затем намерены выполнять разные операции на основе указанной команды и опций сканер подходит лучше.

«Сканер, с другой стороны, имеет гораздо больше встроенного сыра; он может делать все, что может делать BufferedReader, и на том же уровне эффективности». Не согласитесь, BufferedReader немного быстрее по сравнению со Scanner, потому что Scanner выполняет анализ входных данных, а BufferedReader просто читает последовательность символов.

BufferedReader имеет значительно большую буферную память, чем сканер. Используйте BufferedReader , если вы хотите получить длинные строки из потока и используйте Scanner , если вы хотите разобрать конкретный тип токена из потока.

Scanner может использовать tokenize с помощью настраиваемого разделителя и анализировать поток в примитивные типы данных, тогда как BufferedReader может читать и хранить String.

BufferedReader является синхронным, а Scanner - нет. Используйте BufferedReader , если вы работаете с несколькими потоками.

Это руководство по посвящено использованию класса Scanner в Java пакета java.util. Мы будем показывать базовое применение класса Scanner до самых расширенных функций этого класса, используя примеры.

Объявление:
public final class Scanner
extends Object
implements Iterator, Closeable

Создает новый сканер, который создает значения, отсканированные из указанного источника.

Это означает, что мы можем использовать любой из этих классов в Java при создании экземпляра объекта Scanner.

public Scanner(InputStream source)

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

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

public Scanner(File source) выдает исключение FileNotFoundException

Этот конструктор очень прост. Просто требует источник файла. Единственной целью этого конструктора является создание экземпляра объекта Scanner для сканирования через файл.

public Scanner(Path source) throws IOException

public Scanner(String source)

Создает новый сканер, который выдает значения, отсканированные из указанной строки.

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

Scanner в Java для чтения файлов

Считать файл очень легко, используя класс Scanner. Нам просто нужно объявить это с помощью конструктора Scanner, например:

Хитрость в итерации по токену Scanner состоит в том, чтобы применять те методы, которые начинаются с hasNext, hasNextInt и т.д. Давайте сначала остановимся на чтении файла построчно.

В приведенном выше фрагменте кода мы использовали флаг scan.hasNextLine() как средство проверки наличия токена, который в этом примере доступен на входе сканера. Метод nextLine() возвращает текущий токен и переходит к следующему.

Комбинации hasNextLine() и nextLine() широко используются для получения всех токенов на входе сканера. После этого мы вызываем метод close(), чтобы закрыть объект и тем самым избежать утечки памяти.

Считать строку из консоли ввода, используя Scanner Class

Класс Scanner принимает также InputStream для одного из своих конструкторов. Таким образом, ввод можно сделать с помощью:

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

Важные советы

Недавно я обнаружил одну проблему. Допустим, что мы просим пользователя ввести идентификатор сотрудника и имя сотрудника из консоли.

После чего мы будем читать ввод с консоли, используя сканер. Идентификатор сотрудника будет читаться с nextInt(), а имя сотрудника будет читаться как nextLine(). Это довольно просто, но это не сработает.

Приведенный выше пример не будет работать, потому что метод nextInt не читает последний символ новой строки вашего ввода и, следовательно, эта новая строка используется при следующем вызове nextLine.

Чтобы решить эту проблему, просто используйте next вместо nextline, но если вы хотите указать только nextLine, добавьте еще один scan.nextLine() после nextInt. Посмотрите ниже фрагмент кода:

Список методов java.util.Scanner

Ниже приведен список методов java.util.Scanner, которые мы можем использовать для сложного анализа ввода.

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим - напишите комментарий, добавьте информации к статье.

Читайте также: