Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция
Скачать 25.04 Mb.
|
Часть II. Библиотека чтобы получить представление об использовании памяти. Далее выполняйте свой код и снова вызывайте метод f гееМ ешогу ( ) , чтобы увидеть, сколько памяти он резервирует. В следующей программе иллюстрируется описанная идея l l Демонстрация применения totalMemory(), freeMemory() и g c (). class MemoryDemo { public static void main(String a r g s []) { Runtime r = Runtime.getRuntime(); long meml, m e m 2 ; Integer someints[] = new Всего памяти " + г .totalMemory()); meml = r Свободной памяти вначале " + г .g c (); meml = r Свободной памяти после сбора "мусора " + m e m l ) ; for(int i=0; i<1000; i++) someints[i] = new Integer(i); // Распределить Integer mem2 = r Свободной памяти после распределения " + m e m 2 ); System.out.p r i Использовано памяти для распределения " + (meml-mem2)); // отбросить Integers for(int i=0; i<1000; i + +) someints[i] = null; r.gc(); // запуск сборщика "мусора mem2 = г Свободной памяти после сбора" + " отброшенных Integer: " + Пример вывода этой программы показан здесь (конечно, ваши реальные результаты могут отличаться). Всего памяти Свободной памяти вначале 7 513 Свободной памяти после сборки "мусора Свободной памяти после распределения 8240 Использовано памяти для распределения 1742 Свободной памяти после сборки отброшенных Integer: 842 Выполнение других программ В безопасных средах вы можете использовать язык Java для выполнения других тяжеловесных процессов (те. программ) в многозадачной операционной системе. Некоторые формы метода ехес () позволяют указывать программу, которую вы хотите выполнить, а также передать ей входные параметры. Метод ехес () возвращает объект класса Process, который затем может использоваться для управления взаимодействием вашей программы Java с этим вновь запущенным процессом. ПocкoлькyJava может функционировать на множестве платформ в средах разнообразных операционных систем, метод ехес () сильно зависит от среды Глава 16. Пакет java.lang , В следующем примере используется метод ехес () для запуска приложения Блокнот (Notepad) — простого текстового редактора Windows. Очевидно, что этот пример должен выполняться на платформе операционной системы Windows. // Демонстрация е хе с (). class ExecDemo { public static void main(String a r g s []) { Runtime r = Runtime.getRuntime()? Process p = null; try { p = r .e x e c ("notepad"); } catch (Exception e) Ошибка запуска Существует несколько альтернативных форм метода ехес ( ), но форма, показанная в этом примере, используется наиболее часто. Объектом класса Process, возвращенным методом ехес () , можно манипулировать методами класса Process после того, как программа запущена. Вы можете удалить процесс методом destroy ( ). Метод wai tFor () заставит вашу программу ожидать завершения процесса. Метод exitValue () возвратит значение, которое вернет процесс по завершении. Обычно это будет 0, если никаких проблем не возникнет. Ниже представлен предыдущий пример метода ехес (), модифицированный так, чтобы он ожидал завершения запущенного процесса Ожидает завершения notepad, class ExecDemoFini { public static void main(String a r g s []) { Runtime r = Runtime.getRuntime(); Process p = null; try { p = r .e x e c ("notepad"); p .w a i t F o r (); } catch (Exception e) Ошибка запуска notepad."); } System.out.p r i ntln("Notepad возвратил " + Пока выполняется процесс, вы можете писать в его стандартный вводи читать его стандартный вывод. Методы getOutputStream () и getlnputStream () возвращают дескрипторы стандартных потоков in и out процесса. (Ввод-вывод детально рассматривается в главе Класс Класс ProcessBuilder обеспечивает другой способ запуска процессов и управления ими (те. программами. Как объяснялось ранее, все процессы представляются классом Process, и процесс может быть запущен методом Runtime ехес ( ). Класс ProcessBuilder предлагает более развитые средства управления процессами. Например, вы можете установить текущий рабочий каталоги изменить параметры окружения. В классе ProcessBuilder определены следующие конструкторы аргументы ... аргументы Часть II. Библиотека Здесь аргументы список аргументов, указывающих имя программы, которую нужно запустить, со всеми необходимыми аргументами командной строки. Впер вом конструкторе аргументы передаются через список класса List. Во втором они указываются через параметр с переменным количеством аргументов. В табл. 16.12 описаны методы, определенные в классе Таблица 16.12. Методы, определенные в классе ProcessBuilder Метод Описание List ProcessBuilder command (List . . . аргументы d i r e c t o r y () ProcessBuilder directory (File каталог, String> environ ment () ProcessBuilder inh e r i t l O O ProcessBuilder.Redirect redi- re c t E r r o r () ProcessBuilder redirectError(File f) ProcessBuilder redirectError(ProcessBuilder. Redirect цель redirectErrorStream() ProcessBuilder redirectErrorStream(boolean объединить) Возвращает ссылку на объект класса List, которая содержит имя программы и ее аргументы. Изменения в этом списке относятся к вызванному объекту Устанавливает имя программы и ее аргументы через параметр аргументы Изменения в этом списке относятся к вызванному объекту. Возвращает ссылку на вызванный объект Устанавливает имя программы и ее аргументы через параметр аргументы Возвращает ссылку на вызванный объект Возвращает текущий рабочий каталог вызванного объекта. Это может быть значение null, если каталог тот же, что и у программы Java, которая запустила процесс Устанавливает текущий каталог для вызванного объекта. Возвращает ссылку на вызванный объект Возвращает переменные окружения, ассоциированные с вызванным объектом, в виде пар ключ- значение” Заставляет вызванный процесс использовать те же исходный и целевой объекты для стандартных потоков ввода-вывода, что и вызывающий процесс. (Добавлено в JDK Возвращает целевой объект для стандартной ошибки как объект ProcessBuilder. Redirect. Добавлено в JDK Устанавливает определенный файл как целевой объект для стандартной ошибки. Возвращает ссылку вызывающему объекту. (Добавлено в JDK Устанавливает как целевой объект для стандартной ошибки файл, определенный параметром цель Возвращает ссылку вызывающему объекту. Добавлено в JDK Возвращает значение true, если стандартный поток ошибок перенаправлен на стандартный выходной поток. Возвращает значение false, если потоки различны Если параметр объединить содержит значение true, то стандартный поток ошибок перенаправляется на стандартный вывод. Если параметр объединить содержит значение false, то потоки разделены, что является состоянием по умолчанию. Возвращает ссылку вызывающему объекту Глава 16. Пакет java.lang 4 4 Окончание табл. М е Щ Описание ProcessBuilder.Redirect redi rect Input () ProcessBuilder redirectlnput(File f) ProcessBuilder redirectlnput(ProcessBuilder. Redirect источник цель s t a r t () throws Возвращает источник для стандартного ввода как объект ProcessBuilder. Redirect. Добавлено в JDK Устанавливает источник для стандартного ввода, как определенный файл. Возвращает ссылку вызывающему объекту. (Добавлено в 7) Устанавливает источник для стандартного ввода как определено параметром источник Возвращает ссылку вызывающему объекту. Добавлено в JDK Возвращает целевой объект для стандартного вывода как объект ProcessBuilder. Redirect. Добавлено в JDK Устанавливает определенный файл как цель для стандартного устройства вывода. Возвращает ссылку вызывающему объекту. (Добавлено Устанавливает цель для стандартного устройства вывода, как определено параметром цель Возвращает ссылку вызывающему объекту. Добавлено в JDK Запускает процесс, указанный в вызванном объекте. Другими словами, запускает заданную программу__________________________________ Обратите в табл. 16.12 внимание на то, что комплект 7 добавляет несколько новых методов, которые используют новый класс ProcessBuilder.Redirect. Этот абстрактный класс инкапсулирует источник ввода-вывода или целевой объект, связанный с процессом. Кроме того, эти методы позволяют вам переадресовать источник или целевой объект операций ввода-вывода. Например, вызвав метод to ( ) , можно переадресовать в файл, вызвав метод f г от ( ), можно переадресовать из файла, а вызвав метод appendTo () — добавить в файл. Объект класса File, связанный с файлом, может быть получен при вызове метода f ile (). Эти методы представлены ниже ProcessBuilder.Redirect to(File f ) static ProcessBuilder.Redirect from(File f ) static ProcessBuilder.Redirect appendTo(File f ) File Класс ProcessBuilder Redirect поддерживает также метод type ( ), который возвращает значение типа перечисления ProcessBuilder. Туре. Это перечисление описывает тип перенаправления. Его значениями являются APPEND, INHERIT, PIPE, READ и WRITE. В классе определены также константы INHERIT и Чтобы создать процесс, используя класс ProcessBuilder, нужно просто создать экземпляр класса ProcessBuilder, указав имя программы и все необходимые аргументы. Чтобы начать выполнение программы, вызовите метод start () для этого созданного экземпляра. Ниже показан пример, который запускает приложение N otepad — текстовый редактор Windows. Обратите внимание на то, что в качестве аргумента передается имя файла, который нужно редактировать PBDemo { public static void main(String a r g s []) { Часть II. Библиотека Java tr y { ProcessBuilder proc = new ProcessBuilder("notepad.exe", "testfile"); p r o c .sta r t (); } catch (Exception e) Ошибка запуска Класс Этот класс содержит коллекцию статических методов и переменных. Стандартный ввод, выводи вывод ошибок исполняющей системы Java хранятся в переменных i n , o u t и e r r . Методы, определенные в классе S y s te m , перечислены в табл. 16.13. Многие из них передают исключение S e c u r i t y E x c e p t i o n , если операция не допускается диспетчером безопасности. Давайте взглянем на некоторые случаи обычного применения класса S y ste m Таблица 16.13. Методы, определенные в классе System МеТОА Описание static void arraycopy(Object источник нач Источника е с t цель начЦ ели размер которая l l i s () static void exit(int код Выхода e n v (String которая getProperty(String которая Копирует массив. Массив, подлежащий копированию, передается в параметре источника индекс позиции, с которой начинается копирование из источник в нач И сточн и ка. Массив, принимающий копию, передается в цель, а индекс позиции в нем, куда нужно начать копирование, — в параметре начЦели. Параметр размер задает количество копируемых элементов Удаляет переменную окружения, указанную в которая. Возвращается предыдущее значение, ассоциированное скот о рая Возвращает консоль, ассоциированную с JVM. В случае отсутствия у JVM текущей консоли возвращается значение Возвращает текущее время в миллисекундах, прошедших с полуночи 1 января 1970 года Прерывает выполнение и возвращает значение кодВы хода родительскому процессу (обычно операционной системе. По соглашению 0 означает нормальное завершение. Все другие значения обозначают разные варианты ошибок Инициирует сбор “мусора” Возвращает объект интерфейса Мар, содержащий текущие переменные окружения и их значения Возвращает значение, ассоциированное с переменной окружения, имя которой передано в которая Возвращает свойства, ассоциированные с системой времени выполнения Java (класс Properties описан в главе Возвращает свойство, ассоциированное с которая Если описанный объект не найден, возвращает значение nul 1 Глава 16. Пакет java.lang 4 4 Окончание табл. 16.13 Метод Описание static String getProperty(String которая поумолчанию ) static SecurityManager g e t S e c u r i t y M a n a g e r () static int identityHashCode(Object объект Channel m h e r i t e d C h a n n e l () throws IOException static String l i n e S e p a r a t o r () static void load(String им яФайл аБи бл иотеки) static void loadLibrary(String им яБ ибл иотек и void mapLibraryName(String библ long n a n o T i m e () static void r u n F i n a l i z a t i o n () static void s e t E r r (PrintStream поток Ошибок вхП оток) static void setOut(PrintStream вы хП оток ) static void setProperties(Properties сист Свойства которая д исп Без Возвращает свойство, ассоциированное с ко тора я. Если описанный объект не найден, возвращается значение поумолчанию Возвращает текущий диспетчер безопасности или значение nul 1 , если никакого диспетчера не установлено Возвращает идентификационный хеш-код для объект 'Возвращает канал, унаследованный виртуальной машиной Java. Возвращает значение null, если никакого канала не унаследовано Возвращает строку, которая содержит символы разделителя строки Загружает динамическую библиотеку, файл которой задан параметром им яФайл аБибл иотеки , включая полный путь доступа Загружает динамическую библиотеку, имя которой ассоциировано сим яБибл иотеки Возвращает зависящее от платформы имя библиотеки библ Получает наиболее точный таймер системы и возвращает его значение в наносекундах, прошедших от какого-то определенного начального момента. Точность таймера неизвестна Инициирует вызов методов finalize () для неиспользуемых, но еще не утилизированных объектов Устанавливает стандартный поток ошибок в поток Ошибок Устанавливает стандартный входной поток in в вх Поток Устанавливает стандартный выходной поток в вы хПоток Устанавливает текущие системные свойства в сист Свойства Присваивает значение свойству по имени которая Устанавливает диспетчер безопасности д исп Без Часть II. Библиотека Использование метода cur rent TimeMills ( ) для измерения времени выполнения программы Одно применение класса S ystem , которое, возможно, вы сочтете интересным, — это использование метода c u r r e n t T im e M ills () для фиксаций времени выполнения различных частей вашей программы. Метод c u r r e n t T i m e M i l l s () возвращает текущее время в миллисекундах, прошедшее с полуночи 1 января 1970 года. Чтобы хронометрировать часть вашей программы, сохраните это значение непосредственно перед началом выполнения данной части. Немедленно после выполнения вызовите метод c u r r e n t T i m e M i l l s () еще раз. Временем выполнения будет разница между конечными начальным временем. Сказанное демонстрируется в следующей программе Измерение времени выполнения программы class Elapsed { public static void main(String a r g s []) { long start, Время перебора от 0 до 100 ООО ООО Время перебора от 0 дополучить начальное время for(long i=0; i < 100000000L; i + +) ; end = System.currentTimeMillis(); // получить конечное время Время выполнения " + (Пример запуска этой программы (имейте ввиду, что ваши результаты могут от личаться). Время перебора от 0 до 100 000 Время выполнения Если таймер вашей системы имеет точность уровня наносекунд, вы можете переписать предшествующую программу с использованием метода n a n o T im e () вместо метода c u r r e n t T i m e M i l l s ( ) . Например, ниже показано ключевое изменение программы, переписанной для использования метода n a n o T im e ( ) . start = System.nanoTime(); // получить начальное время i=0; i < 100000000L; i++) ; end = System.nanoTime(); // получить конечное время Использование метода arraycopy Метод a r r a y c o p y () может применяться для быстрого копирования массива любого типа из одного места в другое. Это намного быстрее, чем эквивалентный цикл, написанный чисто на языке Java. Ниже показан пример двух массивов, копируемых методом a r r a y c o p y (). Вначале массива копируется в массив Ь. Затем все элементы массива а сдвигаются вниз на единицу. После этого массив b смещается вверх на одну позицию Использование arraycopy(). class ACDemo { static byte a[] = { 65, 6 6 , 6 1 , 68, 6 9 , 70, 71, 1 2 , 1 3 , 74 }; static byte b [] = { 1 1 , 1 1 , 1 1 , 1 1 , 1 1 , 1 1 , 1 1 , 77, 77, 77 }; Глава 16. Пакет java.lang 4 4 7 public static void main(String a r g s []) { System.out'.println ("a = " + new String(a)), System.out.println("b = " + new String(b)), System.arraycopy(a, 0, b, 0, a.length); System.out.println("a = " + new String(a)) System.out.println("b = " + new String(b)) System.arraycopy(a, 0, a, 1, a.length - 1) System.arraycopy(b, 1, b, 0, b.length - 1) System.out.println("a = " + new String(a)) System.out.p r intln("b = " + new Как вы можете видеть из следующего вывода, копировать можно один и тот же источники получатель в обоих направлениях. а = ь = мммммммммм а = ABCDEFGHIJ b = ABCDEFGHIJ а = AABCDEFGHI b = Свойства окружения Во всех случаях доступны следующие свойства a v a .vendor l i n e .separator jav a .class.version j a v a .v e n d o r .u r 1 o s .arch java.compiler java.version os.name java.ext.dirs j a v a . v m . name os.version j a v a .home java.vm.specification.name path.separator java.io.tmpdir java.vm.specification.vendor user.dir j a v a .1ibrary.path java.vm.specification.version user.home java.specification.name j a v a .v m Вы можете получить значения различных переменных окружения, вызвав метод System, get Property () . Например, следующая программа отображает путь к текущему пользовательскому каталогу ShowUserDir { public static void main(String a r g s []) Класс b je c Как упоминалось в части I, класс Obj ect — это суперкласс для всех других классов. В классе Object определены методы, перечисленные в табл. 16.14, которые применимы к любому объекту Таблица 16.14. Методы, определенные в классе o b je c t ш |