Строки и текстовый ввод-вывод в языке программирования

Сущность и значение строк в программировании, характеристика конструкторов класса String, StringBuilder, Character. Применение методов сравнения строк, специфика их модификации, замены и разбиения. Аргументы командной строки, текстовый ввод-вывод.

Рубрика Программирование, компьютеры и кибернетика
Вид лекция
Язык русский
Дата добавления 26.04.2015
Размер файла 278,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Пример 7.9. Применение метода split() для разбора строки на лексемы.

import java.util.Scanner;

public class TokenTest

{

public static void main( String[] args )

{

Scanner scanner = new Scanner(System.in, "UTF-8");

System.out.println("Введите строку:");

String line = scanner.nextLine();

String[] tokens = line.split(" ");

System.out.printf( "Количество слов: %d\nСлова:\n", tokens.length);

for(String token : tokens){

System.out.println(token);}

}

}

Результат:

Введите строку:

Это очень большая строка для разбиения на лексемы

Количество слов: 8

Слова:

Это

очень

большая

строка

для

разбиения

на

лексемы

Рассмотрим задачу, в которой будет использоваться рассмотренный метод split() для парсинга введенного арифметического выражения.

Задача 1.3. Напишите программу - калькулятор, выполняющую операции над целыми числами. Программа получает выражение в одной строке аргумента. Выражение состоит из целого числа, оператора и второго целого числа. Например, чтобы сложить два целых числа, нужно передать строку: "2 + 3", при этом программа должна выдать следующий результат: 2 + 3 = 5.

Объяснение: по условию задачи выражение для вычисления необходимо передавать в главный метод в виде одного аргумента командной строки. В таком случае Массив args[] будет содержать только один элемент - args[0] и args.length = 1.

Запишем алгоритм решения задачи:

1.Используя args.length определим, является ли переданное выражение одним аргументом командной строки. Если нет, то завершим выполнение программы, используя оператор System.exit(1).

2.Разделим выражение в строке args[0] на три лексемы (слова) tokens[0], tokens[1] и tokens[2]. В качестве разделителя будем использовать метод Integer.parseInt(), который преобразует строку в число. При этом строка должна состоять из цифр. Если это не так, то программа будет завершена с ошибкой.

3.Выполним арифметические операции над операндами tokens[0] и tokens[2] с использованием оператора tokens[1].

public class Calculator {

public static void main(String[] args) {

if (args.length!= 1) {

System.out.println("Используйте для ввода:

\"operand1 operator operand2\"");

System.exit(1);

}

int result = 0;

String[] tokens = args[0].split(" ");

switch(tokens[1].charAt(0)){

case '+': result = Integer.parseInt(tokens[0]) +

Integer.parseInt(tokens[2]);

break;

case '-': result = Integer.parseInt(tokens[0]) -

Integer.parseInt(tokens[2]);

break;

case '*': result = Integer.parseInt(tokens[0]) *

Integer.parseInt(tokens[2]);

break;

case '/': result = Integer.parseInt(tokens[0]) /

Integer.parseInt(tokens[2]);

}

System.out.println(tokens[0] + ' ' + tokens[1] + ' ' + tokens[2] + " = " + result);

}

}

В коде задачи 7.3 был использован метод Integer.parseInt(), который находится в класса java.lang.Integer и предназначен для преобразования строки в число. Другие классы-оболочки для примитивных типов: Short, Long, Float и Double также содержат статические методы:

parseShort(String s)

parseLong(String s)

parseFloat(String s)

parseDouble(String s),

которые возвращают числовые эквиваленты строки s.

1.4.2 Класс StringTokenizer

В пакет java.util входит простой класс StringTokenizer, облегчающий разбор строк. Класс StringTokenizer небольшой, в нем всего три конструктора и шесть методов, наиболее важные из которых, приведены в табл. 7.11.

Таблица 7.11 - Конструктор и методы класса java.util. StringTokenizer

Конструктор/Метод

Описание

StringTokenizer(String s)

Конструктор создает объект, готовый разбить строку s на лексемы, разделенные пробелами, символами табуляций '\t', перевода строки '\n' и возврата каретки '\r' . Разделители не включаются в число слов.

StringTokenizer (String s, String delimiters)

Конструктор задает разделители вторым параметром delimiters, например:

StringTokenizer("Казнить,нельзя:пробелов-нет", " \t\n\r,:-");

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

StringTokenizer(String s, String delimiters, boolean flag)

Конструктор позволяет включить разделители в число слов. Если параметр flag равен true, то разделители включаются в число слов, если false - нет. Например:

StringTokenizer("а - (b + с) / b * с", " \t\n\r+*-/(), true);

String nextToken ()

Возвращает в виде строки следующую лексему

boolean hasMoreTokens ()

Возвращает true, если в строке еще есть слова, и false, если слов больше нет

int countTokens ()

Возвращает количество оставшихся в строке лексем

String nextToken(String newDelimiters)

Позволяет "на ходу" менять разделители. Следующая лексема будет выделена по новым разделителям newDelimiters; новые разделители действуют далее вместо старых разделителей, определенных в конструкторе или предыдущем методе nextToken ().

В разборе строки на лексемы (слова) активно участвуют два метода: метод nextToken(), который возвращает в виде строки следующее слово и логический метод hasMoreTokens(), который возвращает true, если в строке еще есть слова, и false, если слов больше нет. Метод countTokens() возвращает число оставшихся слов.

Схема парсинга очень проста и приведена ниже:

String s = "Строка, которую мы хотим разобрать на слова";

StringTokenizer st = new StringTokenizer(s, " \t\n\r,.");

while(st.hasMoreTokens()){

// Получаем слово и что-нибудь делаем с ним, например,

// просто выводим на экран

System.out.println(st.nextToken());

}

Важное дополнение! Описание стандартных средств Java для работы со строками был бы не полный без упоминания о регулярных выражениях и классах Pattern и Matcher. Регулярное выражение (Regular Expressions) представляет собой строку, которая описывает шаблон поиска соответствующих символов в другой строке. Такие выражения используются для проверки верности введенных данных и обеспечивают ввод данных в определенном заданном формате. Например, почтовый индекс должен состоять из пяти цифр, и фамилия должна содержать только буквы и пробелы. Одно из применений регулярных выражений - это разработка компилятора. Часто большие и сложные регулярные выражения используется для проверки синтаксиса программы. Если код программы не совпадает с регулярным выражением, компилятор знает, что есть синтаксические ошибки в коде. За неимением времени, в данном курсе мы не будем изучать регулярные выражения. Те, кому интересна данная тема могут найти информацию о регулярных выражениях в книгах по Java, а также изучая многочисленные ресурсы на информационных просторах Интернета.

1.5 Текстовый ввод-вывод

Базовые классы для ввода/вывода расположены в пакете java.io. Поэтому для работы с ними нужно записать import java.io.*; а в программе объявить экземпляры соответствующих классов.

Консольный ввод с помощью методов класса Scanner был рассмотрен нами в главе 3, здесь кратко поговорим о консольном вводе с помощью стандартных средств пакета java.io, которые были в Java, начиная с ее самой первой версии.

Для ввода с клавиатуры в программе следует объявить экземпляры следующих классов:

InputStreamReader is = new InputStreamReader(System.in);

BufferedReader st = new BufferedReader(is);

Для ввода данных типа String следует использовать метод readLine() класса BufferedReader.

Ниже приведен пример ввода строки с консоли:

import java.io.*;

class Input {

public static void main(String[] args){

InputStreamReader is = new InputStreamReader(System.in);

BufferedReader bis = new BufferedReader(is);

try {

System.out.println("Введите строку:");

String s = bis.readLine();

System.out.println("Введенная строка "+s);

} catch (IOException e)

{System.out.println("ошибка ввода "+ e);}

}}

Обратите внимание на то, что ввод данных следует обязательно осуществлять в обработчике исключительных ситуаций try-cath (так как это сделано в примере). Компилятор следит за этим и в противном случае выдаст ошибку компиляции.

При вводе символов и числовых данных придется проводить преобразование из типа String в соответствующий тип. Для этого могут быть использованы следующие методы классов-оболочек примитивных типов: метод valueOf(String s), который возвращает объект класса-оболочки, соответствующий цифровой строке и метод хххValue(), который преобразует значение этого класса к базовому примитивному типу ххх. Например:

Integer.valueOf(s).intValue();

Long.valueOf(s).longValue();

Float.valueOf(s).floatValue();

Double.valueOf(s).doubleValue();

Для типа char используют метод, позволяющий преобразовать строку в массив символов char[]:

s.toCharArray();

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

System.out.println("введите число a:");

String s = st.readLine();

Double number = Double.valueOf(s).doubleValue();

Для преобразования строки в число можно также использовать рассмотренные ранее статические методы классов-оболочек Integer, Short, Long, Float и Double:

parseInt(String s)

parseShort(String s)

parseLong(String s)

parseFloat(String s)

parseDouble(String s)

средств Java

import java.io.*;

class Vvod{

public static void main (String[] args){

double a,b;

int c;

InputStreamReader is = new InputStreamReader(System.in);

BufferedReader bis = new BufferedReader(is);

try {

System.out.println("Bведите число a:");

String numberStr = bis.readLine();

a = Double.valueOf(numberStr).doubleValue();

System.out.println("Bведите число b:");

numberStr = bis.readLine();

b = Double.valueOf(numberStr).doubleValue();

System.out.println("Bведите число a:");

int a = Integer.parseInt(br.readLine());

} catch (IOException e)

{System.out.println("ошибка ввода "+ e);}

System.out.println((a+b)*c);

}}

1.5.1 Класс File

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

Файлы размещаются в каталоге в файловой системе. Абсолютное имя файла (или полное имя) содержит имя файла с указанием полного пути. Например, c:\book\Welcome.java - это абсолютное имя для файла Welcome.java в операционной системе Windows. Здесь c:\book путь к каталогу, в котором хранится файл. Абсолютное имя файла зависит от платформы. Так в UNIX, абсолютное имя файла может иметь вид /home/liang/book/Welcome.java, где /home/liang/book - это путь к каталогу для файла Welcome.java.

Относительное имя файла - это его имя по отношению к текущему рабочему каталогу. Например, Welcome.java является относительным именем файла, если текущий рабочий каталог c:\book, при этом абсолютное имя файла будет c:\book\Welcome.java.

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

Имя файла - это строка. Класса File является классом-оболочкой для имени файла и пути к каталогу. Например, new File("c:\\book") создает объект File для каталога c:\book, а new File("c:\\book\\test.dat") создает объект File для файла c:\book\test.dat, созданного в Windows. Можно использовать метод isDirectory() класса File для того, чтобы проверить, является ли объект каталогом, а метод isFile() для проверки является ли объект файлом.

Таблица 7.12 - Конструктор и методы класса java.io.File

Конструктор/Метод

Описание

File (String pathname)

Создает объект File для заданного пути. Путь может быть к файлу или к каталогу.

File(String parent, String child)

Создает объект File для child в директории parent. child может быть именем файла или подкаталога.

File(File parent, String child)

Создает объект File для child в директории parent, где parent является объектом File. В предыдущем конструкторе parent является строкой.

boolean exists()

Возвращает true, если файл или каталог, представленный объектом File, существует.

boolean canRead()

Возвращает true, если файл, представленный объектом File, существует и может быть прочитан.

boolean canWrite()

Возвращает true, если файл, представленный объектом File, существует и может быть записан.

boolean isDirectory()

Возвращает true, если объект File является каталогом.

boolean isFile()

Возвращает true, если объект File является файлом.

boolean isAbsolute()

Возвращает true, если объект File создан с помощью абсолютного пути.

boolean isHidden()

Возвращает true, если файл представленный объектом File скрытый. Точное

определение «скрытый» зависит от системы. В Windows, можно пометить файл, как скрытый, в диалоговом окне свойств файла. В системах Unix, файл скрытый, если ее имя начинается с символа точка (.).

String getAbsolutePath()

Возвращает полное абсолютное имя файла или каталога, представленного объектом File.

String getCanonicalPath()

Возвращает то же, что и getAbsolutePath() кроме того, что удаляет избыточные имена, такие как "". и "..", в имени пути, разрешает символические ссылки (в Unix), и преобразует буквы дисков в стандартном верхнем регистре (в Windows).

String getName()

Возвращает последнее имя в полном пути каталога или файла. Например,

new File("c:\\book\\test.dat").getParent() вернет test.dat.

String getPath()

Возвращает полный путь каталога и имени файла. Например,

new File("c:\\book\\test.dat").getPath() вернет c:\book\test.dat.

String getParent()

Возвращает полный родительский каталог текущего каталога или файла. Например, new File("c:\\book\\test.dat").getParent() вернет c:\book.

long lastModified()

Возвращает время последнего изменения файла.

long length()

Возвращает размер файла, или 0, если он не существует или если он является каталогом.

File[] listFile()

Возвращает файлы из директории.

boolean delete()

Удаление файла или каталога. Метод возвращает true, если удаление прошло успешно.

boolean renameTo(File dest)

Переименование файла или каталога с указанным именем dest. Метод возвращает true, если операция выполнена успешно.

boolean mkdir()

Создает каталог в объекте File. Возвращает true, если каталог успешно создан.

Будьте внимательны! Разделитель в записи пути к файлу в Windows - обратная косая черта (\). Обратная косая черта является специальным символом в Java и должна быть записана в тексте в виде \ \ .

Конструктор, создающий экземпляр File не создает файл на машине!!! Вы можете создать экземпляр File для любого файла независимо от того, существует он или нет.

В примере 7.11 показано, как создать объект и использовать методы класса File для получения его свойств. Программа создает объект File для файла MyFile.txt. Этот файл хранятся в текущем каталоге, т.е. там же где и сама программа.

Пример 7.11. Применение методов класса File.

public class TestFileClass {

public static void main(String[] args) {

java.io.File file = new java.io.File("MyFile.txt");

System.out.println("Does it exist? "+file.exists());

System.out.println("The file has "+file.length()+" bytes");

System.out.println("Can it be read? "+file.canRead());

System.out.println("Can it be written? "+file.canWrite());

System.out.println("Is it a directory? "+file.isDirectory());

System.out.println("Is it a file? "+file.isFile());

System.out.println("Is it absolute? "+file.isAbsolute());

System.out.println("Is it hidden? "+file.isHidden());

System.out.println("Absolute path is "+

file.getAbsolutePath());

System.out.println("Last modified on "+ new

java.util.Date(file.lastModified()));

}

}

Результат:

Does it exist? true

The file has 10 bytes

Can it be read? true

Can it be written? true

Is it a directory? false

Is it a file? true

Is it absolute? false

Is it hidden? false

Absolute path is E:\MyProgram\sss\MyFile.txt

Last modified on Sun Apr 14 20:36:17 EEST 2013

1.5.2 Файловый ввод - вывод

В данном разделе рассмотрим использование класса Scanner для чтения данных из текстового файла и класса PrintWriter для записи данных в текстовый файл.

Объект File инкапсулирует свойства файла, но он не содержит методов для создания файла или для чтения/записи данных из/в файл (называемый вводом-выводом данных). Для выполнения ввода-вывода нужно создать объект, используя соответствующие классы ввода/вывода Java. Объекты содержат методы для чтения/записи данных из/в файл. Есть два типа файлов: текстовые и бинарные. В этом разделе рассмотрим работу только с текстовыми файлами.

Запись в текстовый файл. Класс PrintWriter. Класс java.io.PrintWriter может быть использован для создания файла и записи данных в текстовый файл. Для этого нужно создать объект PrintWriter для текстового файла следующим образом:

PrintWriter output = new PrintWriter(filename); Затем, для объекта PrintWriter могут быть вызваны методы print(), println(), и printf() для записи данных в файл. В табл. 7.13 приведены часто используемые методы класса PrintWriter.

Таблица 7.13 - Конструкторы и методы класса java.io. PrintWriter

Конструктор / Метод

Описание

PrintWriter (File file)

Конструктор создает объект PrintWriter для указанного объекта File.

PrintWriter (String filename)

Конструктор создает объект PrintWriter для указанного в строке имени файла.

void print(String s)

Записывает строку в файл.

void print(char c)

Записывает символ в файл.

void print(char[]cArray)

Записывает массив символов в файл.

void print(int i)

Записывает целочисленное значение в файл.

void print(long l)

Записывает значение long в файл.

void print(float f)

Записывает значение float в файл.

void print(double d)

Записывает значения double в файл.

void print(boolean b)

Записывает логическое значение в файл.

Также содержит перегруженные варианты методов println() и printf().

Применения методов класса PrintWriter для записи данных в текстовый файл иллюстрирует код в примере 7.12.

Пример 7.12. Запись данных в текстовый файл с помощью методов класса PrintWriter.

Объяснение: в программе создается экземпляр класса PrintWriter и записывают две строки в файл scores.txt. Каждая строка состоит из имени и фамилии студента (строка) и оценки (целое число).

Вызов конструктора PrintWriter создаст новый файл, в том случае если файл не существует. Если же файл уже существует, то на экране появится соответствующее сообщение и программа завершится.

Вызов конструктора PrintWriter может выбрасывать исключений ввода/вывода, поэтому в заголовке главного метода main() записан код для работы с этим типом исключения: IOException. Запись данных в текстовый файл осуществляется методами print() и println() класса PrintWriter

Для закрытия файла обязательным является использование метода close(). Если данный метод не вызвать, данные могут быть сохранены в файле не полностью.

import java.io.*;

public class WriteData {

public static void main(String[] args) throws IOException {

File file = new File("с://scores.txt");

if (file.exists()) {

System.out.println("File already exists");

System.exit(1);

}

PrintWriter output = new PrintWriter(file);

output.print("John Smith ");

output.println(90);

output.print("Eric Jones ");

output.println(85);

output.close();

}

}

Чтение данных из текстового файла с помощью класса Scanner. Класс java.util.Scanner уже активно используется нами для чтения строк и примитивных значений при вводе с консоли. Scanner считывает лексемы, разделенные символами пробела. Для чтения с клавиатуры применяется конструктор класса Scanner с входным параметром System.in:

Scanner input = new Scanner(System.in);

Для чтения из файла, вызывают конструктор Scanner, в который в качестве параметра передается файл:

Scanner input = new Scanner(new File(filename));

Наиболее часто используемые методы класса Scanner приведены в табл.7.14.

Таблица 7.14 - Конструкторы и методы класса java.util.Scanner

Конструктор / Метод

Описание

Scanner (File source)

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

Scanner(String source)

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

close()

Закрывает поток сканера.

boolean hasNext()

Возвращает true, если сканер имеет еще данные для чтения, в противном случае возвращается false.

boolean hasNext*()

Возвращает true, если следующая лексема сканера имеет тип, указанный под звездочкой, в противном случае возвращается false.

String next()

Возвращает следующую лексему в виде строки из сканера. При этом можно использовать запись System.out.println(scan.next()), если следующего элемента нет то, то бросается исключение java.util.NoSuchElementException.

String nextLine()

Возвращает строку, которая заканчивается разделителем из сканера.

byte nextByte()

Возвращает из сканера следующее слово, преобразованное к типу byte.

short nextShort()

Возвращает из сканера следующее слово, преобразованное к типу short.

int nextInt()

Возвращает из сканера следующее слово, преобразованное к типу int.

long nextLong()

Возвращает из сканера следующее слово, преобразованное к типу long.

float nextFloat()

Возвращает из сканера следующее слово, преобразованное к типу float.

double nextDouble()

Возвращает из сканера следующее слово, преобразованное к типу double.

Scanner useDelimiter(String pattern)

Устанавливает разделитель для сканера и возвращает этот сканер. В качестве аргумента может принимать Pattern.

Scanner findInLine(String pattern)

Принимает в качестве аргумента String или Pattern. Используется для поиска в лексеме того или иного значения.

Scanner skip(String pattern)

Принимает в качестве аргумента String или Pattern. Используется для пропуска лексем.

Программный код в примере 7.13 иллюстрирует применение методов класса Scanner для чтения данных из текстового файла scores.txt.

Пример 7.13. Применение методов класса Scanner для чтения данных из текстового файла.

Объяснение: в программе для считывания данных из файла, вызывается конструктор класса Scanner, в который передается file - экземпляр класса java.io.File.

Вызов конструктора new Scanner(file) может вызывать исключение ввода/вывода, поэтому в заголовке главного метода объявляется throws Exception.

В каждой итерации цикла while из текстового файла считываются имя, фамилия и оценка. После цикла входной файл закрывается. Делать это не обязательно, однако вызов в конце работы с файлом метода close() является хорошей практикой и позволяет освободить ресурсы, занимаемые файлом.

import java.util.Scanner;

import java.io.*;

public class ReadData {

public static void main(String[] args) throws Exception {

File file = new File("e://scores.txt");

Scanner input = new Scanner(file);

while (input.hasNext()) {

String firstName = input.next();

String lastName = input.next();

int score = input.nextInt();

System.out.println(firstName + " " + lastName + " "

+ score);}

input.close(); }

}

Результат:

John Smith 90

Eric Jones 85

Методы nextByte(), nextShort(), nextInt(), nextLong(), nextFloat(), nextDouble() и next() позволяют считывать лексемы (слова), разделенные разделителями. По умолчанию, разделителями являются пробелы. Можно использовать метод useDelimiter(String regex), чтобы установить новый шаблон для разделителей. При чтении лексема автоматически преобразуется в значение byte, short, int, long, float и double для nextByte(), nextShort(), nextInt(), nextLong(), nextFloat() и nextDouble(), соответственно. При выполнении метода next() никакого преобразования не выполняется. Если лексема не соответствует ожидаемому типу, то бросается исключение java.util.InputMismatchException.

Оба метода next() и nextLine() читают строку. Метод next() считывает строку ограниченную разделителями, и nextLine() читает строку, заканчивающуюся строковым разделителем. Строковый разделитель определяется установленной операционной системой. Это может быть \r \n в Windows и \n в UNIX. Чтобы узнать строковый разделитель на конкретной платформе, используйте

String lineSeparator = System.getProperty("line.separator");Если входные данные вводятся клавиатуры, то ввод строки заканчивается нажатием клавиши Enter, которая соответствует символу \n.

Рассмотренные выше методы для чтения данных примитивных типов не читают разделитель после лексемы. Если после метода читающего данные примитивных типов вызывается метод nextLine(), то он считывает символы, которые начинаются с данного разделителя и заканчиваются строковым разделителем. Строковый разделитель считывается, но не является частью строки, возвращаемой методом nextLine().

Предположим, текстовый файл с именем test.txt содержит строку

34 567

После того, как будет выполнен следующий код,

Scanner input = new Scanner(new File("test.txt"));

int intValue = input.nextInt();

String line = input.nextLine(); intValue содержит 34, а строка line содержит символы '' '', 5, 6, и 7.

Что произойдет, если ввод осуществляется с клавиатуры? Предположим, вы ввели 34 и нажали клавишу Enter, затем ввели 567 и нажали клавишу Enter, то после выполнения следующего кода:

Scanner input = new Scanner(System.in);

int intValue = input.nextInt();

String line = input.nextLine();в переменной intValue будет значение 34, а в line - пустая строка. Метод nextInt() считает 34 и остановится на разделителе, который в данном случае является строковым разделителем (клавиша Enter). Метод nextLine() закончится после чтения строкового разделителя и вернет строку, прочитанную перед строковым разделителем, однако до строкового разделителя нет ни одного символа, поэтому строка line пустая.

С помощью класса Scanner можно прочитать данные из файла или с клавиатуры. Можно также сканировать данные из строки. Например, следующий код

Scanner input = new Scanner("13 14");

int sum = input.nextInt() + input.nextInt();

System.out.println("Sum = " + sum);напечатает Sum = 27

Рассмотрим еще несколько примеров чтения данных из строки. Допустим, имеется текстовый файл in.txt с таким содержанием:

Hello 24 world 87

Создадим сканнер нашего файла:

Scanner scan = new Scanner(new File("in.txt"));

Попробуем вывести всё содержимое файла:

while (scan.hasNext()) {

System.out.println(scan.next());

}

Будет выведено:

Hello

24

world

87

Выведем только числа. Для этого добавим в код блок if else:

while (scan.hasNext()) {

if(scan.hasNextBigInteger()) {

System.out.println(scan.next()); }else{scan.next();}

}

На выводе получим:

24

87

Попробуем в файл добавить разделитель / :

Scanner scan = new Scanner(new FileReader("in"));

scan.useDelimiter("/");

while (scan.hasNext()) {

System.out.println(scan.next());

}

И изменим файл in.txt:

Hello/24/world 87

Запустим программу и на выводе получим:

Hello

24

world 87

Воспользуемся методом findInLine() для того чтобы найти все слова. Воспользуемся регулярным выражением:

Pattern patt = Pattern.compile("[a-z A-Z]+");

изменим код следующим образом:

while (scan.hasNext()) {

System.out.println(scan.findInLine(patt));

scan.next();

}

На выводе получим:

Hello

world

Если добавить перед циклом:

scan.skip("Hello");

То на выходе будет только:

world

Задача 14. Напишите программу, заменяющую в текстовом файле все вхождения строки на новую строку. Имя файла и строки передаются из командной строки. Аргументы следующие:

SourceFile TargetFile oldString NewString.

Например, при вводе

FormatString.java t.txt StringBuilder StringBuffer

следует заменить все вхождения StringBuilder на StringBuffer в файле FormatString.java и сохранить новый файл t.txt.

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

Создается Scanner для исходного файла, и PrintWriter для записи в целевой файл. В цикле while считывается строка из исходного файла и заменяется на новую, далее новая строка записывается в целевой файл. Чтобы гарантировать, что данные будут сохранены в файле должным образом, в конце программы с помощью метода close() закрываем входной и выходной потоки.

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

import java.io.*;

import java.util.*;

public class ReplaceText {

public static void main(String[] args) throws Exception {

if (args.length != 4) {

System.out.println("Enter the command-line arguments");

System.exit(1);

}

//Проверяем существует ли исходный файл

File sourceFile = new File(args[0]);

if(!sourceFile.exists()){

System.out.println("Source file " + args[0]

+ " does not exist");

System.exit(2);

}

//Проверяем существует ли целевой файл

File targetFile = new File(args[1]);

if(targetFile.exists()){

System.out.println("Target file " + args[1]

+ " already exists");

System.exit(3);

}

//Создаем сканер для ввода и PrintWriter для вывода

Scanner input = new Scanner(sourceFile);

PrintWriter output = new PrintWriter(targetFile);

while(input.hasNext()){

String s1 = input.nextLine();

String s2 = s1.replaceAll(args[2], args[3]);

output.println(s2);

}

input.close();

output.close();

}

}

Упражнения

1. Пусть четыре строки s1, s2, s3 и s4 заданы следующим образом:

String s1 = "Welcome to Java";

String s2 = s1;

String s3 = new String("Welcome to Java");

String s4 = "Welcome to Java";

Каковы результаты следующих выражений?

1.1) s1 == s2

1.2) s2 == s3

1.3) s1.equals(s2)

1.4) s2.equals(s3)

1.5) s1.compareTo(s2)

1.6) s2.compareTo(s3)

1.7) s1 == s4

1.8) s1.charAt(0)

1.9) s1.indexOf('j')

1.10) s1.indexOf("to")

1.11) s1.lastIndexOf('a')

1.12) s1.lastIndexOf("o", 15)

1.13) s1.length()

1.14) s1.substring(5)

1.15) s1.substring(5, 11)

1.16) s1.startsWith("Wel")

1.17) s1.endsWith("Java")

1.18) s1.toLowerCase()

1.19) s1.toUpperCase()

1.20) "Welcome ".trim()

1.21) s1.replace('o','T')

1.22) s1.replaceAll("o","T")

1.23) s1.replaceFirst("o","T")

1.24) s1.toCharArray()

1.25) Предположим, что s1 и s2 - две строки. Какие из следующих утверждений или выражений являются неверными?

String s = new String("new string");

String s3 = s1 + s2;

String s3 = s1 - s2;

s1 == s2;

s1 >= s2;

s1.compareTo(s2);

int i = s1.length();

char c = s1(0);

char c = s1.charAt(s1.length());

3. Что будет распечатано в результате выполнения следующего кода?

String s1 = "Welcome to Java";

String s2 = s1.replace("o", "abc");

System.out.println(s1);

System.out.println(s2);

4. Пусть строка s1 равна "Welcome", а s2 равна "welcome". Запишите коды для следующих заданий:

4.1) Проверьте, равны ли s1 и s2, результат присвойте логической переменной isEqual;

4.2) Проверьте, равны ли s1 и s2 без учета регистра, результат присвойте логической переменной isEqual;

4.3) Сравните s1 и s2, результат присвойте целочисленной переменной х.

4.4) Сравнивает s1 и s2 без учета регистра, результат присвойте целочисленной переменной х.

4.5) Проверьте, имеет ли s1 префикс AAA, результат присвойте логической переменной b;

4.6) Проверьте, имеет ли s1 суффикс AAA, результат присвойте логической переменной b;

4.7) Длину s1 присвойте целочисленной переменной х;

4.8) Присвойте первый символ s1 символьной переменной х;

4.9) Создайте новую строку s3, которая объединяет s1 и s2.

4.10) Создайте подстроку из s1, начиная с индекса 1;

4.11) Создайте подстроку из s1 от индекса 1 до индекса 4;

4.12) Создайте новую строку s3, преобразовав строку s1 в нижний регистр;

4.13) Создайте новую строку s3, преобразовав строку s1 в верхний регистр;

4.14) Создайте новую строку s3, удалив пробелы на обоих концах s1;

4.15) Замените все вхождения символа e на Е в s1, результат запишите в новую строку s3.

4.16) Разделите на слова строку Welcome to Java and HTML в массив tokens. В качестве разделителя использовать пробел.

4.17) Присвойте индекс первого вхождения символа е в s1 целочисленной переменной х;

4.18) Присвойте индекс последнего вхождения строки abc в s1 целочисленной переменной х.

5. Что будет распечатано в результате выполнения следующего кода и почему?

public class Test {

String text;

public Test(String s) {

text = s;

}

public static void main(String[] args) {

Test test = new Test("ABC");

System.out.println(test);

}

}

6. Что будет распечатано в результате выполнения следующего кода?

public class Test {

public static void main(String[] args) {

String s = "Hi, Good Morning";

System.out.println(m(s));

}

public static int m(String s) {

int count = 0;

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

if (Character.isUpperCase(s.charAt(i)))

count++;

return count;

}

}

7. Предположим, что строки s1 и s2 определены следующим образом:

StringBuilder S1 = новая StringBuilder ("Java");

StringBuilder s2 = новая StringBuilder ("HTML");

Чему будет равна строка s1 после каждого из следующих операторов. Предположим, что операторы выполняются независимо друг от друга.

7.1) s1.append(" is fun");

7.2) s1.append(s2);

7.3) s1.insert(2, "is fun");

7.4) s1.insert(1, s2);

7.5) s1.charAt(2);

7.6) s1.length();

7.7) s1.deleteCharAt(3);

7.8) s1.delete(1, 3);

7.9) s1.reverse();

7.10) s1.replace(1, 3, "Computer");

7.11) s1.substring(1, 3);

7.12) s1.substring(2);

8. Что будет распечатано в результате выполнения следующего кода?

public class Test {

public static void main(String[] args) {

String s = "Java";

StringBuilder builder = new StringBuilder(s);

change(s, builder);

System.out.println(s);

System.out.println(builder);

}

private static void change(String s, StringBuilder builder) {

s = s + " and HTML";

builder.append(" and HTML");

}

9. Определите результаты выполнения следующей программы, при вызове ее следующими тремя способами:

1. java Test I have a dream

2. java Test "1 2 3"

3. java Test

public class Test {

public static void main(String[] args) {

System.out.println("Number of strings is " + args.length);

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

System.out.println(args[i]);

}

}

10. Напишите содержимое файла temp.txt после выполнения следующей программы:

import java.io.*;

public class Test {

public static void main(String[] args) throws Exception {

PrintWriter output = new PrintWriter("temp.txt");

output.printf("amount is %f %e\r\n", 32.32, 32.32);

output.printf("amount is %5.4f %5.4e\r\n", 32.32, 32.32);

output.printf("%6b\r\n", (1 > 2));

output.printf("%6s\r\n", "Java");

output.close();

}

}

11. Предположим, с клавиатуры были введены 45 57,8 789, а затем нажата клавиша Enter. Чему будут равны переменные после выполнения следующего кода:

Scanner input = new Scanner(System.in);

int intValue = input.nextInt();

double doubleValue = input.nextDouble();

String line = input.nextLine();

12. Предположим, что с клавиатуры ввели 45, нажали клавишу Enter, 57,8, нажали клавишу Enter, 789, и нажали клавишу Enter. Чему будут равны переменные после выполнения следующего кода:

Scanner input = new Scanner(System.in);

int intValue = input.nextInt();

double doubleValue = input.nextDouble();

String line = input.nextLine();

14. Как известно, можно проверить, является ли строка подстрокой другой строки с помощью метода indexOf() класса String. Разработайте собственный метод, выполняющий данную функцию. Напишите программу, которая предлагает пользователю ввести две строки, и проверяет, является ли первая строка подстрокой второй.

15. Напишите метод, который подсчитывает количество букв в строке (не используя метод length) со следующим заголовком:

public static int countLetters(String s)

Напишите тестовую программу, которая предлагает пользователю ввести строку и печатает количество букв в строке.

16. Некоторые веб-сайты накладывают определенные правила на вводимые пользователями пароли. Напишите метод, который проверяет, является ли строка допустимым паролем. Предположим, что пароль должен соответствовать следующим правилам:

- содержать не менее восьми символов;

- состоять только из букв и цифр;

- содержать не менее двух цифр.

Напишите программу, которая предлагает пользователю ввести пароль и отображает Valid Password, если правила соблюдены или Invalid Password в противном случае.

17. Напишите метод, который подсчитывает количества каждой цифры в строке, используя следующий заголовок:

public static int[] count(String s)Метод подсчитывает, сколько раз цифра появляется в строке и возвращает массив из десяти элементов, каждый из которых содержит значение счетчика для соответствующей цифры. Так, например, после выполнения int[] counts = count("12203AB3"), counts[0] равен 1, counts[1] равен 1, counts[2] равен 2, counts[3] равен 2.Напишите тестовую программу, которая предлагает пользователю ввести строку и отображает количества вхождений каждой цифры в строку.

18. Напишите метод, который возвращает отсортированную строку и имеет следующий заголовок:

public static String sort(String s)

Например, sort("acb") вернет abc. Напишите тестовую программу, которая предлагает пользователю ввести строку и выводит отсортированную строку.

19. Напишите метод, который проверяет, является ли два слова анаграммой. Два слова являются анаграммой, если они содержат те же буквы в любом порядке. Так, например, слова крона и нора являются анаграммой. Заголовок метода:

public static boolean isAnagram(String s1, String s2)

Напишите тестовую программу, которая предлагает пользователю ввести две строки и, если они анаграммы, отображает two strings are anagrams либо two strings are not anagrams в противном случае.

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

Размещено на Allbest.ru


Подобные документы

  • Понятие стандартной библиотеки C++. Количество удобных операций и методов. Создание пустой строки и конструктор копирования. Создание строки на основе нуль-терминальной строки. Примеры использования конструкторов. Присвоение строки типа string.

    презентация [221,2 K], добавлен 04.05.2012

  • Анализ особенностей работы и основных операций с символьными строками, указателями, функциями, динамически выделяемой памятью. Ввод текста в пустые строки. Вывод введённого текста на экран. Замена первых слов строк. Проверка правильности работы программы.

    курсовая работа [1,9 M], добавлен 17.07.2014

  • Понятие и использование командной строки. Открытие командной строки. Команды, выполняемые с помощью командной строки. Как выполнить команду с повышенными привилегиями. Изменение внешнего вида окна командной строки с помощью параметров командной строки.

    презентация [948,2 K], добавлен 22.10.2014

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

    курсовая работа [1,1 M], добавлен 09.12.2016

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

    реферат [14,5 K], добавлен 06.12.2011

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

    курсовая работа [234,6 K], добавлен 27.12.2014

  • Асинхронный ввод/вывод как принципиально новая возможность, введена впервые в Win32 с появлением реальной многозадачности. Организация процедуры Delphi - оптимальное решение для разумного использования блока операторов. Создание блокнота на Delphi.

    курсовая работа [1,3 M], добавлен 06.12.2014

  • Анализ операторов ввода и вывода, а также характеристика форматов, используемых в этих операторах. Оформление законченной программы с применением этих операторов. Структура программы. Алфавит языка и типы данных. Ввод и вывод информации. Форматный вывод.

    лабораторная работа [62,0 K], добавлен 15.07.2010

  • В стандарте языка Си отсутствуют средства ввода-вывода. Операции реализуются с помощью функций, находящихся в библиотеке языка Си, поставляемой в составе системы программирования Си. Потоковый, форматный ввод-вывод. Форматный ввод из входного потока.

    реферат [98,9 K], добавлен 24.06.2008

  • Что такое класс в объектно-ориентированном программировании. Какую структуру имеет модуль в С++. Какими средствами осуществляется консольный ввод данных в языке Си, С++. Инкапсуляция, полиморфизм, наследование. Использование библиотеки "".

    контрольная работа [1,9 M], добавлен 13.11.2016

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.