Прочитать файл в массив java
Обычно у нас есть некоторые данные в памяти, с которыми мы выполняем операции, а затем сохраняем их в файле. Однако, если мы хотим изменить эту информацию, нам нужно вернуть содержимое файла в память и выполнить операции.
Если, например, наш файл содержит длинный список, который мы хотим отсортировать, нам придется прочитать его в адекватную структуру данных, выполнить операции и затем снова сохранить его - в данном случае ArrayList .
Этого можно достичь несколькими разными подходами:
- Files.readAllLines()
- FileReader
- Scanner
- BufferedReader
- ObjectInputStream
- Java Streams API
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Этот код кажется логически звучащим – мы считываем целое число из файла, затем следующую строку, затем второе целое число. Если вы попытаетесь запустить этот код, исключение InputMismatchException будет выдано без очевидной причины.
Если вы начнете отладку и распечатаете отсканированное, вы увидите, что в хорошо загружено, но Строки пусты.
Почему это так? Первое, что важно отметить, это то, что как только Сканер считывает что-либо из файла, он продолжает сканирование файла с первого символа после ранее отсканированных данных.
Например, если бы в файле было “12 13 14” и мы один раз вызвали .nextInt () , сканер впоследствии сделал бы вид, что в файле было только “13 14”. Обратите внимание, что пробел между “12” и “13” все еще присутствует.
Вторая важная вещь, которую следует отметить, – первая строка в нашем example.txt файл содержит не только номер 12 , он содержит то, что он назвал “символом новой строки”, и на самом деле это 12\n вместо просто 12 .
Наш файл, на самом деле, выглядит так:
Когда мы впервые вызываем .nextInt() , Сканер считывает только число 12 и оставляет первое \n непрочитанным.
..следующая строка() затем считывает все символы, которые сканер еще не прочитал, пока не достигнет первого символа \n , который он пропускает, а затем возвращает прочитанные символы. Именно в этом и заключается проблема в нашем случае – у нас остался символ \n после прочтения 12 .
Поэтому, когда мы вызываем .nextLine () , в результате мы получаем пустую строку, так как Сканер не добавляет символ \n в возвращаемую строку.
Теперь Сканер находится в начале второй строки вашего файла, и когда мы пытаемся вызвать .nextInt() , Сканер обнаруживает что-то, что не может быть проанализировано в int и выдает вышеупомянутое Исключение InputMismatchException .
Решения
- Поскольку мы знаем, что именно не так в этом коде, мы можем жестко прописать обходной путь. Мы просто “потребим” символ новой строки между .nextInt() и .nextLine() :
- Учитывая, что мы знаем, как example.txt отформатирован, мы можем прочитать весь файл строка за строкой и проанализировать необходимые строки с помощью Integer.parseInt() :
Решение
Здраствуйте, очень интересная тема. Эту задачу можна решить так:
Благодарю за ответ, код работает, правда до конца не разобрал все тонкости, BufferedReader не так хорошо знаю, но логика понятна.
Немного посидел, поразбирался со сканером, у него есть замечательный метод nextLine(), который также считывает всю строку, а вторым сканером и методом next() возможно разделить полученную одну строку уже на отдельные числа, как ни станно но работает, может кто с такой-же проблемой столкулся вот код:
Yurets_Y, просто используйте BufferedReader, у него есть метод readLine(), который считывает построчно, как раз то, что вам и надо.
Чтение из файла txt в двумерный массив
Добрый день! подскажите как заполнить двумерный массив данными из txt файла. Пример файла во.
Чтение txt-файла и заполнение таблицы Excel
Добрый день, есть текстовый файл. Из него вынимаем данные, и записываем в excel таблицу. Вопрос как.
Чтение данных из txt файла и заполнение html-таблицы
Подскажите, пожалуйста, столкнулся с проблемой (в связи с тем, что умею выводить только "Привет.
Создать двумерный массив из файла .txt
Создать двумерный массив и заполнить его из файла (первые два числа в файле задают количество строк.
Существует множество способов чтения и записи файлов на Java .
Обычно у нас есть некоторые данные в памяти, с которыми мы выполняем операции, а затем сохраняем их в файле. Однако, если мы хотим изменить эту информацию, нам нужно поместить содержимое файла обратно в память и выполнить операции.
Если, например, наш файл содержит длинный список, который мы хотим отсортировать, нам придется прочитать его в соответствующей структуре данных, выполнить операции, а затем сохранить его еще раз – в данном случае ArrayList .
Этого можно достичь с помощью нескольких различных подходов:
- Файлы.Строки для чтения()
- Устройство для чтения файлов
- Сканер
- Буферизатор
- Поток ввода объекта
- API потоков Java
Files.readAllLines ()
Начиная с Java 7, можно очень просто ArrayList
Мы также можем указать charset для обработки различных форматов текста, если необходимо:
Files.readAllLines() автоматически открывает и закрывает необходимые ресурсы.
ObjectInputStream
ObjectInputStream следует использовать только вместе с ObjectOutputStream . Эти два класса помогают нам сохранять объект (или массив объектов) в файл, а затем легко читать из этого файла.
Это можно сделать только с классами, реализующими интерфейс Serializable Интерфейс Serializable не имеет методов или полей и служит только для определения семантики сериализации:
Files.readAllBytes ()
Более низкоуровневый подход к чтению - это Files.readAllBytes() , который возвращает byte[] . Разработчик должен использовать эти байты
- преобразовать их в строку, обработать как есть и т. Д.
Этот метод также принимает Path к файлу, который мы хотим прочитать:
Теперь bytes содержит всю информацию из файла input.txt Самый простой способ преобразовать его в String - поместить их в конструктор с необязательным Charset :
Примечание. Такие решения, как чтение всех байтов, подходят только в случаях, когда мы имеем дело с небольшими размерами файлов. Это не способствует производительности и не имеет особого смысла хранить большие файлы в памяти программы.
6. Заключение
Подводя итог, мы обсудили некоторые распространенные способы чтения содержимого файла в ArrayList . Кроме того, мы рассмотрели некоторые преимущества и недостатки различных методов.
Например, мы можем использовать BufferedReader для буферизации символов для повышения эффективности. В качестве альтернативы мы могли бы использовать Scanner для чтения примитива с помощью разделителей. Или, возможно, мы могли бы просто использовать Files.ReadAllLines(), не беспокоясь о базовой реализации.
В этом руководстве мы будем читать файл в виде строки в Java. Есть несколько способов чтения текстового содержимого файла.
Вот список всех классов и методов, которые мы рассмотрим:
Заключение
В этой статье мы рассмотрели некоторые распространенные техники чтения файлов в строки в Java. Есть много вариантов, но большинство из них имеют схожий основной принцип: указать путь к файлу, прочитать содержимое в структуре данных (например, char[] или String); затем выполните некоторую заключительную обработку, чтобы соответствующим образом собрать все содержимое файла.
Мы рассмотрели метод File.lines() метод Files.readString() метод Files.readAllBytes() , а также классы Scanner , FileReader и BufferedReader
4. Использование Сканера
Еще один распространенный способ чтения файлов-через Scanner .
Сканер это простой текстовый сканер, используемый для разбора примитивных типов и строк с использованием регулярных выражений.
При чтении файлов/| Scanner инициализируется с помощью объектов File или FileReader :
Подобно BufferedReader, Scanner предоставляет readLine() метод для чтения всей строки . Дополнительно , он также предоставляет метод hasNext () , чтобы указать, доступно ли больше значений для чтения или нет:
Scanner разбивает свои входные данные на токены с помощью разделителя, разделителем по умолчанию является пробел. Эти токены могут быть преобразованы в значения различных типов с помощью различных доступных методов next ( nextInt , nextLong и т. Д.):
API потоков Java
Начиная с Java 8, еще одним быстрым и простым способом загрузки содержимого файла в Список массивов было бы использование Java Streams API :
Однако имейте в виду, что этот подход, как и Files.ReadAllLines () , будет работать только в том случае, если данные хранятся в строках.
Приведенный выше код не делает ничего особенного, и мы редко использовали бы потоки таким образом. Однако, поскольку мы загружаем эти данные в ArrayList , чтобы мы могли обработать их в первую очередь, потоки предоставляют отличный способ сделать это.
Мы можем легко сортировать/фильтровать/сопоставлять данные перед их сохранением в списке массивов :
5. Использование Files.ReadAllLines
Вероятно, самый простой способ прочитать файл и разобрать все его строки в ArrayList – это использовать метод ReadAllLines () , доступный в классе Files :
Этот метод также может принимать параметр charset для чтения в соответствии с определенной кодировкой символов:
Файлы.Строки для чтения()
Начиная с Java 7, можно очень простым способом загрузить все строки файла в ArrayList :
Мы также можем указать кодировку для обработки различных форматов текста, если это необходимо:
Files.ReadAllLines() автоматически открывает и закрывает необходимые ресурсы.
Files.lines ()
Класс Files содержит статические методы для работы с файлами и каталогами. Полезный метод - lines() который возвращает поток строк: Stream . Из этого потока можно получить строки, содержащиеся в файле.
Метод принимает Path к файлу, который мы хотели бы прочитать, с необязательной Charset . Мы будем использовать try-with-resources для автоматизации очистки и закрытия:
Поскольку метод возвращает Stream , мы используем его forEach() для перебора строк со ссылкой на метод для краткости.
Вместо печати каждой линии, StringBuilder может быть использован для добавления строк:
С помощью StringBuilder весь файл может быть представлен в одной String ( contents выше переменная содержимого). Перед выполнением таких итераций важно учитывать длину входного файла.
Если файл не слишком велик, можно поместить его в строку, однако, если его размер составляет сотни мегабайт, это не так разумно.
BufferedReader
BufferedReader - это объект, предназначенный для чтения текста из потока ввода символов. Он буферизован, что означает, что он использует внутренний буфер для временного хранения. Как мы видели в предыдущем разделе, «обычные» Reader иногда могут быть неэффективными.
Рекомендуется обернуть любой потенциально дорогостоящий Reader в BufferedReader для повышения производительности, поскольку символы буферизации позволяют более эффективно читать вводимый текст.
Создадим экземпляр BufferedReader :
На данный момент у нас есть буферный объект чтения, готовый читать содержимое из input.txt . В этом примере мы будем читать файл построчно, хотя BufferedReader поддерживает чтение отдельных символов по отдельности, а также нескольких символов в массив.
Давайте воспользуемся этим BufferedReader для чтения файла и сохранения его содержимого построчно в строку:
И снова мы используем StringBuilder для сбора всех строк. Чтобы отделить каждую строку, мы добавляем между ними \n Наконец, закрываем поток.
Буферизатор
BufferedReader считывает текст из потока ввода символов, но делает это путем буферизации символов для обеспечения эффективных операций .read () . Поскольку доступ к жесткому диску занимает очень много времени, BufferedReader собирает больше данных, чем мы просим, и сохраняет их в буфере.
Идея заключается в том, что когда мы вызываем .read() (или аналогичную операцию), мы, скорее всего, скоро снова прочитаем из того же блока данных, из которого мы только что прочитали, и поэтому “окружающие” данные хранятся в буфере. В случае, если бы мы хотели прочитать его, мы бы прочитали его непосредственно из буфера, а не с диска, что гораздо эффективнее.
Это подводит нас к тому, что BufferedReader хорошо подходит для чтения больших файлов. BufferedReader имеет значительно большую буферную память, чем Сканер (8192 символа по умолчанию против 1024 символов по умолчанию соответственно).
BufferedReader используется в качестве оболочки для других Читателей , и поэтому конструкторы для BufferedReader принимают Читатель объект в качестве параметра, например Читатель файлов .
Мы используем пробные ресурсы, поэтому нам не нужно закрывать считыватель вручную:
Рекомендуется обернуть файловый редактор с Буферным читателем , именно из-за преимуществ производительности.
3. Использование BufferedReader
Хотя FileReader довольно прост в использовании, рекомендуется всегда оборачивать его с помощью BuffereReader при чтении файла.
Это происходит потому, что BufferedReader использует буфер char для одновременного считывания нескольких значений из потока ввода символов и, следовательно, уменьшает количество вызовов read () , выполняемых базовым FileStream .
Конструкторы для BufferedReader принимают Reader в качестве входных данных. Кроме того, мы также можем указать размер буфера в конструкторах, но для большинства случаев использования размер по умолчанию достаточно велик:
В дополнение к унаследованным методам от класса Reader , BufferedReader также предоставляет метод readLine() для чтения всей строки как строки :
Заключение
Есть несколько различных способов чтения данных из файла в ArrayList . Когда вам нужно только прочитать строки как элементы, используйте Files.readAllLines ; когда у вас есть данные, которые можно легко проанализировать, используйте Scanner ; при работе с большими файлами используйте FileReader с BufferedReader ; при работе с массивом объектов используйте ObjectInputStream (но убедитесь, что данные были записаны с использованием ObjectOutputStream ).
Всем добрый день,
Помогите с реализацией кода, нужен способ чтения табличного файла в массив. но при том, что размер массива изначально не ясен (работаю с таблицами, и они все разные), для примера такая таблица:
1 2 5 4 6 8
3 4 5 15 6 8
7 16 23 4 5 6
в txt файле, приблизительный код написал:
но ка реализовать часть в которой сканер читает строку, а если строка заканчивается начинается запись данных в новый ArrayList не могу найти, может подскажет кто, возможно метод у сканера есть, который сообщает что строка окончена, или метод, который вернет true если сканер считает конец строки, помогите, мне именно эта часть нужна. чтобы сканер четко разделял строки и данные в каждой сторе, примного благодарен за ваши ответы.
Чтение из текстового файла строковых данных в двумерный массив java8
Собственно как это сделать? Scanner использовать или reader или что? Использовать.
Чтение txt-файла
Суть задачи такова: есть исходный текстовик, в котором находится множество чисел, разделенных.
Чтение из файла(txt и xml)
Работаю в eclipce3.5. Подскажите где должен находится файл, из которого читается информация. У меня.
Чтение выборочной информации из txt файла Java
Здравствуйте!Прошу помощи экспертов!Я новичок в Java и пытаюсь решить задачку: Создать текстовый.
Files.readAllLines ()
Начиная с Java 7, можно очень просто ArrayList
Мы также можем указать charset для обработки различных форматов текста, если необходимо:
Files.readAllLines() автоматически открывает и закрывает необходимые ресурсы.
BufferedReader
BufferedReader читает текст из потока ввода символов, но делает это путем буферизации символов для обеспечения эффективных .read() . Поскольку доступ к жесткому диску - это очень трудоемкая операция, BufferedReader собирает больше данных, чем мы запрашиваем, и сохраняет их в буфере.
Идея состоит в том, что когда мы вызываем .read() (или аналогичную операцию), мы, скорее всего, вскоре снова будем читать из того же блока данных, из которого мы только что прочитали, и поэтому «окружающие» данные сохраняются в буфере. Если бы мы захотели его прочитать, мы бы прочитали его прямо из буфера, а не с диска, что намного эффективнее.
Это подводит нас к тому, чем BufferedReader - чтению больших файлов. BufferedReader имеет значительно большую буферную память, чем Scanner (8192 символа по умолчанию против 1024 символа по умолчанию соответственно).
BufferedReader используется как оболочка для других устройств чтения , поэтому конструкторы для BufferedReader принимают объект Reader в качестве параметра, например FileReader .
Мы используем try-with-resources, поэтому нам не нужно закрывать программу чтения вручную:
Рекомендуется заключить FileReader в BufferedReader именно из-за повышения производительности.
FileReader
FileReader используется для чтения файлов. Он предлагает read() и read(char[]) , которые возвращают один символ и несколько символов соответственно. Кроме того, он принимает в конструктор File или String .
FileReader.read (char [])
Откроем файл с помощью FileReader и прочитаем его содержимое:
Метод read() принимает последовательность символов (в которой мы сохраняем прочитанные символы), начальную и конечную точки того, что мы хотим прочитать. В частности, мы решили читать не более 256 символов. Если в input.txt больше, мы прочитаем только 256 символов. Если его меньше, возвращаются читаемые символы.
Возвращаемое значение, хранящееся внутри целого числа n может использоваться для проверки того, сколько символов фактически прочитал метод. Если достигнут конец потока, метод возвращает -1 .
Поскольку метод заполняет char[] , мы можем преобразовать его в String . Аналогичный результат можно получить, используя String.valueOf(char[]) .
FileReader.read ()
Метод read() без char[] читает по одному символу за раз. Нам нужно перебрать содержимое и прочитать каждый символ самостоятельно:
Здесь мы проверяем, не является ли прочитанный символ -1 , что указывает на то, что символов для чтения не осталось. Если нет, мы append() его к StringBuilder и, наконец, преобразуем его в String .
Примечание. И read() и read(char[]) читают байты, преобразуют их в символы и возвращают их один за другим . Это неэффективно и по возможности должно выполняться с буферизацией .
Сканер
Scanner - особенно полезный класс для чтения контента из потоков. Поскольку он работает с абстрактными потоками, его также можно использовать для чтения строк. Scanner работает, разбивая ввод на токены, которые последовательно извлекаются из входного потока.
Поскольку мы работаем со строками, мы хотели бы использовать методы, возвращающие строки. Scanner имеет next() и nextLine() именно для этого. Оба метода возвращают объекты типа String . Первый используется для чтения произвольных строк, тогда как второй анализирует и возвращает целые строки.
Если каждая строка содержит нужное количество данных, то nextLine() - идеальный выбор. Если в файле есть важная информация, разбитая на более мелкие куски, но не обязательно строки (или файл содержит, скажем, одну строку), тогда next() может быть лучшим вариантом.
Scanner принимает множество объектов - Path , InputStream , File и т. Д. Мы будем использовать File :
Мы используем while цикл до тех пор , как sc имеет больше элементов. Если бы мы не проверили с помощью hasNext() , sc выдаст NoSuchElementexception если мы попытаемся получить доступ к элементу после последнего.
Идея использования hasNext() и next() исходит из Iterator , поскольку Scanner внутренне его реализует.
Поток ввода объекта
ObjectInputStream следует использовать только вместе с ObjectOutputStream . Что эти два класса помогают нам сделать, так это сохранить объект (или массив объектов) в файл, а затем легко прочитать из этого файла.
Это можно сделать только с классами, реализующими Сериализуемый интерфейс. Интерфейс Сериализуемый не имеет методов или полей и служит только для определения семантики сериализуемости:
Вывод
Существует несколько различных способов, с помощью которых вы можете считывать данные из файла в ArrayList . Когда вам нужно только прочитать строки как элементы, используйте Files.ReadAllLines ; когда у вас есть данные, которые можно легко проанализировать, используйте Сканер ; при работе с большими файлами используйте FileReader , завернутый в BufferedReader ; при работе с массивом объектов используйте ObjectInputStream (но убедитесь, что данные были записаны с использованием ObjectOutputStream ).
В этом уроке мы обсудим различные способы чтения файла в ArrayList .
Существует множество способов чтения файла в Java . Прочитав файл, мы можем выполнить множество операций с его содержимым.
Некоторые из этих операций, например сортировка, могут потребовать обработки всего содержимого файла в память. Для выполнения таких операций нам может понадобиться прочитать файл как Массив или Список строк или слов.
2. Использование FileReader
Самый простой способ чтения файла в Java-это использование FileReader . По определению, FileReader – это удобный класс для чтения потока символов из файла .
Существует несколько конструкторов, доступных для инициализации считывателя файлов :
Все эти конструкторы предполагают, что кодировка символов по умолчанию и размер байтового буфера по умолчанию являются подходящими.
Однако, если мы хотим предоставить пользовательскую кодировку символов и размер байтового буфера, мы можем использовать InputStreamReader или FileInputStream .
В следующем коде мы продемонстрируем, как читать строки из файла в ArrayList, используя FileReader:
Сканер
Каким бы красивым и простым ни был предыдущий метод, он полезен только для чтения файла построчно. Что было бы, если бы все данные хранились в одной строке?
Scanner - это простой в использовании инструмент для анализа примитивных типов и строк. Использование Scanner может быть настолько простым или сложным, насколько этого хочет разработчик.
Простой пример того, когда мы предпочли бы использовать Scanner был бы, если бы в нашем файле была только одна строка, и данные нужно было бы проанализировать во что-то пригодное для использования.
Разделитель - это последовательность символов, которую Scanner использует для разделения значений. По умолчанию он использует серию пробелов / табуляций в качестве разделителя (пробелы между значениями), но мы можем объявить наш собственный разделитель и использовать его для анализа данных.
Давайте посмотрим на пример файла:
В таком случае легко заметить, что все значения имеют общий разделитель. Мы можем просто объявить, что наш разделитель - "-", окруженный любым количеством пробелов.
Запуск этого фрагмента кода даст нам список ArrayList со следующими элементами:
С другой стороны, если бы мы использовали только разделитель по умолчанию (пробел), ArrayList выглядел бы так:
Scanner имеет несколько полезных функций для анализа данных, таких как nextInt() , nextDouble() и т. Д.
Важно : вызов .nextInt() НЕ вернет следующее int которое можно найти в файле! Он вернет int только в том случае, если следующие элементы, которые "сканирует" Scanner int , в противном случае будет выдано исключение. Простой способ убедиться, что исключение не возникает, - это выполнить соответствующую проверку «имеет» - например, .hasNextInt() перед фактическим использованием .nextInt() .
Несмотря на то, что мы не видим, что когда мы вызываем такие функции, как scanner.nextInt() или scanner.hasNextDouble() , Scanner использует регулярные выражения в фоновом режиме.
Очень важно: чрезвычайно распространенная ошибка при использовании Scanner возникает при работе с файлами, состоящими из нескольких строк, и использовании .nextLine() вместе с .nextInt() , nextDouble() и т. Д.
Взглянем на другой файл:
Часто новые разработчики, использующие Scanner , пишут такой код:
Этот код кажется логически правильным - мы читаем целое число из файла, затем следующую строку, затем второе целое число. Если вы попытаетесь запустить этот код, InputMismatchException будет выброшено без очевидной причины.
Если вы начнете отладку и распечатать то, что вы отсканировали, вы увидите, что int a загружен, но этот String s пуст.
Это почему? Первое, что следует отметить, это то, что как только Scanner что-то читает из файла, он продолжает сканирование файла с первого символа после данных, которые он ранее отсканировал.
Например, если у нас есть «12 13 14» в файле и .nextInt() , сканер впоследствии будет делать вид, будто в файле только «13 14». Обратите внимание, что пробел между «12» и «13» все еще присутствует.
Второе важное замечание: первая строка в нашем example.txt содержит не только число 12 , но и то, что она называет «символом новой строки», и на самом деле это 12\n а не просто 12 .
Наш файл на самом деле выглядит так:
Когда мы впервые вызываем .nextInt() , Scanner считывает только число 12 и оставляет первое \n непрочитанным.
.nextLine() считывает все символы, которые сканер еще не прочитал, пока не достигнет первого \n , который он пропускает, а затем возвращает прочитанные символы. В этом и заключается проблема в нашем случае - у нас остался \n после чтения 12 .
Поэтому, когда мы вызываем .nextLine() мы получаем в результате пустую строку, поскольку Scanner не добавляет \n к возвращаемой строке.
Теперь Scanner находится в начале второй строки в нашем файле, и когда мы пытаемся вызвать .nextInt() , Scanner обнаруживает что-то, что не может быть проанализировано до int и выдает вышеупомянутое InputMismatchException .
Решения
- Поскольку мы знаем, что именно не так в этом коде, мы можем жестко закодировать обходной путь. Мы просто «потребляем» символ новой строки между .nextInt() и .nextLine() :
- Учитывая, что мы знаем, как example.txt мы можем прочитать весь файл построчно и проанализировать необходимые строки с помощью Integer.parseInt() :
Files.readString ()
Начиная с Java 11, Files познакомил нас с readString() , который принимает Path к файлу, а также Charset .
В отличие от Files.lines() , он возвращает String напрямую, а не объект Stream
Java Streams API
Начиная с Java 8, еще одним быстрым и простым способом загрузки содержимого файла в ArrayList было бы использование Java Streams API :
Однако имейте в виду, что этот подход, как и Files.readAllLines() будет работать только в том случае, если данные хранятся в строках.
Приведенный выше код не делает ничего особенного, и мы редко используем потоки таким образом. Однако, поскольку мы загружаем эти данные в ArrayList чтобы мы могли их обработать в первую очередь, потоки предоставляют отличный способ сделать это.
Мы можем легко отсортировать / отфильтровать / сопоставить данные перед сохранением их в ArrayList :
Сканер
Каким бы приятным и простым ни был предыдущий метод, он полезен только для чтения файла строка за строкой. Что произойдет, если все данные будут храниться в одной строке?
Сканер – это простой в использовании инструмент для анализа примитивных типов и строк. Использование Сканера может быть настолько простым или сложным, насколько этого хочет разработчик.
Простым примером того, когда мы предпочли бы использовать Сканер , было бы, если бы в нашем файле была только одна строка, и данные должны быть проанализированы во что-то полезное.
Разделитель – это последовательность символов, которую Сканер использует для разделения значений. По умолчанию он использует ряд пробелов/вкладок в качестве разделителя (пробелы между значениями), но мы можем объявить наш собственный разделитель и использовать его для анализа данных.
Давайте взглянем на пример файла:
В таком случае легко заметить, что все значения имеют общий разделитель. Мы можем просто объявить, что” -“, окруженное любым количеством пробелов, является нашим разделителем.
Запуск этого фрагмента кода приведет к тому, что мы получим ArrayList с этими элементами:
С другой стороны, если бы мы использовали только разделитель по умолчанию (пробел), то ArrayList выглядел бы так:
Сканер имеет некоторые полезные функции для анализа данных, такие как nextInt() , nextDouble () и т.д.
Важно : Вызов .nextInt() будет НЕ возвращать следующее int значение, которое можно найти в файле! Он вернет значение int только в том случае, если следующие элементы Сканер “сканирует” являются допустимым значением int , в противном случае будет выдано исключение. Простой способ убедиться, что исключение не возникает, – выполнить соответствующую проверку “имеет”, как .hasNextInt() перед фактическим использованием .nextInt() .
Даже если мы не видим этого, когда мы вызываем такие функции, как scanner.nextInt() или scanner.hasNextDouble () , Сканер использует регулярные выражения в фоновом режиме.
Очень важно: | Чрезвычайно Распространенная ошибка при использовании Сканера возникает при работе с файлами, содержащими несколько строк , и использовании . nextLine () в сочетании с . nextInt () , nextDouble () и т. Д.
Давайте взглянем на другой файл:
Часто новые разработчики, использующие Сканер , пишут код, подобный:
Читайте также: