Formatter(OutStream outStrm)

В приведенных образцах bufзадает буфер для форматированного вывода. Если параметр bufравен null, класс Formatter автоматически размещает объект типа StringBuilder для хранения форматированного вывода. Параметр locопределяет региональные и языковые настройки. Если никаких настроек не задано, используются настройки по умолчанию. Параметр filenameзадает имя файла, который получит форматированный вывод. Параметр charsetопреде­ляет кодировку. Если она не задана, используется кодировка, установленная по умолчанию. Параметр outFпередает ссылку на открытый файл, в котором будет храниться форматированный вывод. В параметре outStrmпередается ссылка на поток вывода, который будет получать отформатированные данные. Если используется файл, выходные данные записываются в файл.

В классе объявлены следующие методы:

Formatter format(String fmtString, Object...args) – форматирует аргументы, переданные в аргументе переменной длины args(коли­чество аргументов в списке вывода не фиксировано), в соответствии со спецификаторами формата, содержащимися в fmtString. Возвращает вызывающий объект;

Formatter format(Locale loc, String fmtString,
Object...args)
– форматирует аргументы, переданные в аргументе перемен­ной длины args, в соответствии со спецификаторами формата, содержащимися
в fmtString. При форматировании используются региональные установки, заданные в lос. Возвращает вызывающий объект;

IOException ioException()– если объект, приемник отформатирован­ного вывода, генерирует исключение типа IOException, возвращает это исключение. В противном случае возвращает null;

Locale locale()– возвращает региональные установки вызывающего объекта;

Appendable out()– возвращает ссылку на базовый объект-приемник для выходных данных;

void flush()–переносит информацию из буфера форматирования и произ­водит запись в указанное место выходных данных, находящихся в буфере. Метод чаще всего используется объектом класса Formatter, связанным с файлом;

void close()– закрывает вызывающий объект класса Formatter, что приводит к освобождению ресурсов, используемых объектом. После закрытия объекта типа Formatter он не может использоваться повторно. Попытка использовать закрытый объект приводит к генерации исключения типа
FormatterClosedEception;

String toString()– возвращает объект типа String, содержащий отформатированный вывод.

При форматировании используются спецификаторы формата:

Спецификатор формата Выполняемое форматирование
%a Шестнадцатеричное значение с плавающей точкой
%b Логическое (булево) значение аргумента
%c Символьное представление аргумента
%d Десятичное целое значение аргумента
%h Хэш-код аргумента
%e Экспоненциальное представление аргумента
%f Десятичное значение с плавающей точкой
%g Выбирает более короткое представление из двух: %е или %f
%o Восьмеричное целое значение аргумента
%n Вставка символа новой строки
%s Строковое представление аргумента
%t Время и дата
%x Шестнадцатеричное целое значение аргумента
%% Вставка знака %

Так же возможны спецификаторы с заглавными буквами: %A (эквивалентно %a). Форматирование с их помощью обеспечивает перевод символов в верхний регистр.

/*пример # 9 : форматирование строки при помощи метода format():

SimpleFormatString.java */

packagechapt07;

import java.util.Formatter;

 

public class SimpleFormatString {

public static void main(String[] args){

Formatter f = new Formatter(); // объявление объекта

// форматирование текста по формату %S, %c

f.format("This %s is about %n%S %c", "book","java",'6');

System.out.print(f);

}

}

В результате выполнения этого кода будет выведено:

This book is about

JAVA 6

/*пример # 10 : форматирование чисел с использованием спецификаторов %x, %o, %a, %g: FormatterDemoNumber.java */

packagechapt07;

import java.util.Formatter;

 

public class FormatterDemoNumber {

public static void main(String[] args) {

Formatter f = new Formatter();

f.format("Hex: %x, Octal: %o", 100, 100);

System.out.println(f);

f = new Formatter();

f.format("%a", 100.001);

System.out.println(f);

f = new Formatter();

for (double i = 1000; i < 1.0e+10; i *= 100) {

f.format("%g ", i);

System.out.println(f);

}

}

}

В результате выполнения этого кода будет выведено:

Hex: 64, Octal: 144

X1.90010624dd2f2p6

1000.00

1000.00 100000

1000.00 100000 1.00000e+07

1000.00 100000 1.00000e+07 1.00000e+09

Все спецификаторы для форматирования даты и времени могут употребляться только для типов long, Long, Calendar, Date.

В таблице приведены некоторые из спецификаторов формата времени и даты.

Спецификатор формата Выполняемое преобразование
%tH Час (00 – 23)
%tI Час (1 – 12)
%tM Минуты как десятичное целое (00 – 59)
%tS Секунды как десятичное целое (00 – 59)
%tL Миллисекунды (000 – 999)
%tY Год в четырехзначном формате
%ty Год в двузначном формате (00 – 99)
%tB Полное название месяца (“Январь”)
%tbили%th Краткое название месяца (“янв”)
%tm Месяц в двузначном формате (1 – 12)
%tA Полное название дня недели (“Пятница”)
%ta Краткое название дня недели (“Пт”)
%td День в двузначном формате (1 – 31)
%tR То же что и "%tH:%tM"
%tT То же что и "%tH:%tM:%tS"
%tr То же что и "%tI:%tM:%tS %Tp" где %Tp = (AM или PM)
%tD То же что и "%tm/%td/%ty"
%tF То же что и "%tY–%tm–%td"
%tc То же что и "%ta %tb %td %tT %tZ %tY"

/*пример # 11 : форматирование даты и времени:

FormatterDemoTimeAndDate.java */

packagechapt07;

import java.util.*;

 

public class FormatterDemoTimeAndDate {

public static void main(String args[]) {

Formatter f = new Formatter();

Calendar cal = Calendar.getInstance();

 

// вывод в 12-часовом временном формате

f.format("%tr", cal);

System.out.println(f);

 

// полноформатный вывод времени и даты

f = new Formatter();

f.format("%tc", cal);

System.out.println(f);

 

// вывод текущего часа и минуты

f = new Formatter();

f.format("%tl:%tM", cal, cal);

System.out.println(f);

 

// всевозможный вывод месяца

f = new Formatter();

f.format("%tB %tb %tm", cal, cal, cal);

System.out.println(f);

}

}

В результате выполнения этого кода будет выведено:

PM

Пт янв 06 15:28:08 EET 2006

3:28

Январь янв 01

Спецификатор точности применяется только в спецификаторах формата %f, , %g для данных с плавающей точкой и в спецификаторе %s – для строк. Он задает количество выводимых десятичных знаков или символов. Например, спецификатор %10.4f выводит число с минимальной шириной поля 10 символов
и с четырьмя десятичными знаками. Принятая по умолчанию точность равна шести десятичным знакам.

Примененный к строкам спецификатор точности задает максимальную длину поля вывода. Например, спецификатор %5.7s выводит строку длиной не менее пяти и не более семи символов. Если строка длиннее, конечные символы отбрасываются.

Ниже приведен пример на использование флагов форматирования.

/*пример # 12: применение флагов форматирования: FormatterDemoFlags.java */

packagechapt07;

import java.util.*;

 

public class FormatterDemoFlags {

public static void main(String[] args) {

Formatter f = new Formatter();

 

// выравнивание вправо

f.format("|%10.2f|", 123.123);

System.out.println(f);

 

// выравнивание влево

// применение флага '-'

f = new Formatter();

f.format("|%-10.2f|", 123.123);

System.out.println(f);

 

f = new Formatter();

f.format("% (d", -100);

// применение флага ' ' и '('

System.out.println(f);

 

f = new Formatter();

f.format("%,.2f", 123456789.34);

// применение флага ','

System.out.println(f);

 

f = new Formatter();

f.format("%.4f", 1111.1111111);

// задание точности представления для чисел

System.out.println(f);

 

f = new Formatter();

f.format("%.16s", "Now I know class java.util.Formatter");

// задание точности представления для строк

System.out.println(f);

 

}

}

В результате выполнения этого кода будет выведено:

| 123,12|

|123,12 |

(100)

123 456 789,34

1111,1111

Now I know class

У класса Formatter есть полезное свойство, которое позволяет задавать аргумент, к которому следует применить конкретный спецификатор формата. По умолчанию соответствие между спецификаторами и аргументами, на которые они воздействуют, устанавливается в соответствии с порядком их следования, слева направо. Это означает, что первый спецификатор формата соответствует первому аргументу, второй спецификатор – второму аргументу и т. д. Однако, используя порядковый номер или индекс аргумента, можно указать явное соответствие спецификатора формата аргументу.

Порядковый номер аргумента указывается за знаком % в спецификаторе формата и имеет следующий формат: N$. Символ N обозначает порядковый номер нужного аргумента, нумерация аргументов начинается с единицы.

/*пример #13: применение порядкового номера аргумента:

FormatterDemoArguments.java */

packagechapt07;

import java.util.Formatter;

 

public class FormatterDemoArguments {

public static void main(String[] args) {

Formatter f = new Formatter();

Number n[] = { 4, 2.2, 3, 1.1 };

f.format("%4$.1f %2$.1f %3$d %1$d", n[0], n[1],

n[2], n[3]);

System.out.println(f);

}

}

В результате выполнения этого кода будет выведено:

1,1 2,2 3 4

Такой же вывод легко получить, используя метод printf() в виде:

System.out.printf("%4$.1f %2$.1f %3$d %1$d", n[0], n[1],

n[2], n[3]);

Лексический анализ текста

Класс StringTokenizer содержит методы, позволяющие разбивать текст на лексемы, отделяемые разделителями. Набор разделителей по умолчанию: пробел, символ табуляции, символ новой строки, перевод каретки. В задаваемой строке разделителей можно указывать другие разделители, например «= , ; : ».

Класс StringTokenizer имеет конструкторы: