К. Арнольд, Д. Гослинг - Язык программирования Java (1160779), страница 15
Текст из файла (страница 15)
Вслучае неудачного завершения команды возбуждается исключение LSFailedException:// java.io.* и java.util.* импортированыpublic String[] ls(String dir, String opts)throws LSFailedException{try {// запустить процессString[] cmdArray = { "/bin/ls", opts, dir };Process child = Runtime.getRuntime().exec(cmdArray);DataInputStreamin = new DataInputStream(child.getInputStream());// прочитать выходные данныеVector lines = new Vector();String line;while ((line = in.readLine()) != null)lines.addElement(line);if (child.waitFor() != 0) // если выполнение ls// было неудачнымthrow new LSFailedException(child.exitValue());String[] retval = new String{lines.size()];lines.copyInto(retval);return retval;} catch (LSFailedException e) {throw e;} catch (Exception e) {throw new LSFailedException(e.toString());}}Класс Process является абстрактным. Каждая реализация Java должна содержать один или несколько классов, расширяющих Process, которыемогут взаимодействовать с процессами на уровне операционной системы.
Такие классы могут обладать расширенным набором функций,полезных для программирования в данной среде. Информация о расширенных функциях должна содержаться в документации.Две другие формы exec позволяют задать набор переменных среды (environment variables ) — системно-зависимых переменных, доступных длянового процесса. Переменные среды передаются методу exec в виде строкового массива, каждый элемент которого задает имя и значениепеременной среды в форме имя = значение.
Имя не может содержать пробелов, хотя значение может быть произвольным. Переменные средыпередаются вторым параметром:public Process exec(String command, String[] env)throws IOExceptionpublic Process exec(String[] command, String[] env)throws IOExceptionСпособ интерпретации переменных среды процессом-потомком является системно-зависимым.
Механизм переменных среды поддерживаетсяпотому, что он существует на самых разных платформах. Для передачи информации между Java-программами следует пользоваться свойствами,а не переменными среды.Упражнение 14.2Напишите программу, которая выполняет exec для аргументов, переданных в командной строке, и выводит результаты работы, причем каждойстроке предшествует ее номер.Упражнение 14.3Напишите программу, которая выполняет exec для аргументов, переданных в командной строке, и выводит результаты, прекращая работупроцесса, когда на выходе появляется заранее определенная строка.14.5.
Класс RuntimeОбъекты класса Runtime описывают состояние runtime-системы Java и те операции, которые она может выполнить. Для получения объектаRuntime, соответствующего текущему runtime-контексту, следует вызвать статический метод Runtime.getRuntime.Одна из операций, выполняемых текущим runtime-контекстом, — получение входного или выходного потока, переводящего символылокального набора в их Unicode-эквиваленты. Многие существующие системы работают с национальными алфавитами, использующими 8разрядные или иные наборы символов, конфликтующие с Unicode. Runtime-контекст предоставляет средства для перевода символов потока,работающего с локальным набором, в эквивалентные им символы Unicode. Например, клавиатура может генерировать 8-разрядный символьныйкод Oriya.
Если воспользоваться потоком System.in, который читает символы с этой клавиатуры и получает от нее локализованный входнойпоток, символы Oriya будут переводиться в их 16-разрядные эквиваленты Unicode в диапазоне \u0b00–\u0b7f. Локализованный выходной потоквыполняет обратное преобразование.Runtime-контекст может быть уничтожен, для этого следует вызвать его метод exit и передать ему код завершения. Метод уничтожает все потокив текущем runtime-контексте, независимо от их состояния. При этом для уничтожения потоков не используется исключение ThreadDeath; онипросто останавливаются без выполнения условий finally.
Для уничтожения всех программных потоков в вашей группе лучше пользоватьсяметодом Thread Group.stop, который позволяет потокам выполнить завершающие действия в соответствии с условиями finally.По традиции, завершающий код exit, равный нулю, означает успешное завершение задачи, а отличный от нуля — неудачу. Существует дваспособа передачи информации с кодом завершения. Первый — немедленно вызвать exit и остановить все потоки.
Второй — убедиться, что всепотоки “чисто” завершились , и только потом вызывать exit. Приведенный ниже пример останавливает все потоки в текущей группе, дает имзавершиться и затем вызывает exit:public static void safeExit(int status) {// получить список всех потоковThread myThrd = Thread.currentThread();ThreadGroup thisGroup = myThrd.getThreadGroup();int count = thisGroup.activeCount();Thread[] thrds = new Thread[count + 20]; // +20 на всякий// случайthisGroup.enumerate(thrds);// остановить все потокиfor (int i = 0; i << thrds.length; i++) {if (thrds[i] != null && thrds[i] != myThrd)thrds[i].stop();}// дождаться завершения всех потоковfor (int i = 0; i << thrds.length; i++) {if (thrds[i] != null && thrds[i] != myThrd) {try {thrds[i].join();} catch (InterruptedException e) {// пропустить поток}}}// теперь можно выходитьSystem.exit(status);}Упражнение 14.4Модифицируйте метод safeExit так, чтобы он обрабатывал потоки, которые могли быть созданы после вызова enumerate.
Кроме того, методдолжен пропускать потоки-демоны, которые будут уничтожаться автоматически.14.6. РазноеДва метода класса System не принадлежат ни к одной из категорий:public static long currentTimeMillis()Возвращает текущее время по Гринвичу в миллисекундах, считая от начала эпохи (00:00:00 UTC, 1 января 1970 года). Время возвращается в видезначения long, поэтому переполнение наступит лишь в 292280995 году — для большинства практических целей этого вполне хватает. Для болеесложных приложений может пригодиться класс Date; см. раздел “Класс Date”.public static void arraycopy(Object src, int srcPos, Object dst, int dstPos, int count)Копирует содержимое исходного массива начиная с элемента src[srcPos] в целевой массив с элемента dst[dstPos]. Копируется ровно countэлементов.
Все ссылки на элементы должны лежать в пределах массива, иначе возбуждается исключение IndexOutOfBoundsException. Типыданных исходного массива должны быть совместимы с типами целевого массива, иначе возбуждается исключение ArrayStoreException.“Совместимость” следует понимать следующим образом: для массивов, содержащих ссылки на объекты, каждый объект исходного массивадолжен присваиваться соответствующему элементу целевого массива. Для массивов со значениями встроенных типов типы должны совпадать, ане просто быть совместимыми по присваиванию; метод arraycopy не может применяться для копирования массива short в массив int.Метод arraycopy правильно работает с перекрывающимися массивами, поэтому он может применяться для копирования одной части массива вдругую.
Например, вы можете сдвинуть все содержимое массива на один элемент к началу, как это было сделано в методе squeezeOut.Два трассировочных метода класса Runtime, traceInstructions и trace MethodCalls, также не относятся ни к одной категории. Каждому из нихпередается логический аргумент; если он равен true, включается трассировка инструкций или вызовов методов соответственно. Чтобыотключить трассировку, следует вызвать метод с аргументом равным false. Каждая реализация может поступать с этими вызовами так, как сочтетнужным, в том числе и игнорировать их, если некуда вывести результаты трассировки.
Вероятно, эти методы будут применяться в первуюочередь в средах разработки.14.7. БезопасностьКласс System содержит два метода для работы с объектом класса Security Manager. Класс SecurityManager включает в себя методы, которыеразрешают или запрещают открытие сокетов (sockets), доступ к файлам, создание программных потоков и т. д. Подробности о работе менеджерабезопасности приведены в спецификации “Java Language Specification”.public static void setSecurityManager(SecurityManager s)Задает системный объект, который является менеджером безопасности. Данное значение может быть присвоено только один раз, чтобы принастройке безопасности системы можно было рассчитывать на то, что оно не изменится.public static SecurityManager getSecurityManager()Выдает системный объект менеджера безопасности. Описание менеджера безопасности слишком усложнило бы эту книгу; за подробностямиобращайтесь к онлайновой документации.14.8.