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 имеет конструкторы: