Краткое руководство по java.lang.System

Краткое руководство по java.lang.System

1. обзор

В этом руководстве мы кратко рассмотрим классjava.lang.System, его возможности и основные функции.

2. IO

System является частьюjava.lang, и одна из его основных функций - предоставить нам доступ к стандартным потокам ввода-вывода.

Проще говоря, он предоставляет три поля, по одному для каждого потока:

  • out

  • err

  • in

2.1. System.outс

System.out указывает на стандартный поток вывода, представляя его какPrintStream, и мы можем использовать его для вывода текста на консоль:

System.out.print("some inline message");

Расширенное использованиеSystem - это вызовSystem.setOut, который мы можем использовать для настройки места, в которое будет записыватьSystem.out:

// Redirect to a text file
System.setOut(new PrintStream("filename.txt"));

2.2. System.errс

System.err очень похож наSystem.out. Оба поля являются экземплярамиPrintStream,, и оба предназначены для вывода сообщений на консоль.

НоSystem.err представляет собой стандартную ошибку, и мы используем ее специально для вывода сообщений об ошибках:

System.err.print("some inline error message");

Консоли часто визуализируют поток ошибок иначе, чем поток вывода.

Дополнительные сведения см. В документацииPrintStream.

2.3. System.inс

System.in указывает на стандарт in, представляя его какInputStream,, и мы можем использовать его для чтения ввода с консоли.

И хотя мы немного более вовлечены, мы все же можем управлять:

public String readUsername(int length) throws IOException {
    byte[] name = new byte[length];
    System.in.read(name, 0, length); // by default, from the console
    return new String(name);
}

ВызываяSystem.in.read, приложение останавливается и ожидает ввода из стандартного файла. Какие бы ни были следующие байтыlength, они будут считаны из потока и сохранены в массиве байтов.

Anything else typed by the user stays in the stream, ожидает следующего звонка наread.

Конечно, работа на таком низком уровне может быть сложной и подверженной ошибкам, поэтому мы можем немного исправить это с помощьюBufferedReader:

public String readUsername() throws IOException {
    BufferedReader reader = new BufferedReader(
      new InputStreamReader(System.in));
    return reader.readLine();
}

При указанном выше расположенииreadLine будет читать изSystem.in до тех пор, пока пользователь не нажмет return, что немного ближе к тому, что мы могли ожидать.

Обратите внимание, что в этом случае мы специально не закрываем поток. Closing the standard inmeans that it cannot be read again for the lifecycle of the program!

И, наконец, расширенное использованиеSystem.in заключается в вызовеSystem.setIn для перенаправления его на другойInputStream.

3. Полезные методы

System предоставляет нам множество методов, которые помогут нам в таких вещах, как:

  • Доступ к консоли

  • Копирование массивов

  • Наблюдение за датой и временем

  • Выход из JRE

  • Доступ к свойствам во время выполнения

  • Доступ к переменным среды и

  • Администрирование сборки мусора

3.1. Доступ к консоли

Java 1.6 представила другой способ взаимодействия с консолью, чем просто использованиеSystem.out иin напрямую.

Мы можем получить к нему доступ, вызвавSystem.console:

public String readUsername() {
    Console console = System.console();

    return console == null ? null :
      console.readLine("%s", "Enter your name: ");
}

Обратите внимание, что в зависимости от базовой операционной системы и того, как мы запускаем Java для запуска текущей программы,console might return null, so always make sure to check before using.

Ознакомьтесь с документациейConsole для других целей.

3.2. Копирование массивов

System.arraycopy - это старый способ копирования одного массива в другой в стиле C.

В основномarraycopy предназначен для копирования одного полного массива в другой массив:

int[] a = {34, 22, 44, 2, 55, 3};
int[] b = new int[a.length];

System.arraycopy(a, 0, b, 0, a.length);
assertArrayEquals(a, b);

Однако мы можем указать начальную позицию для обоих массивов, а также количество элементов для копирования.

Например, предположим, что мы хотим скопировать 2 элемента изa, начиная сa[1] доb, начиная сb[3]:

System.arraycopy(a, 1, b, 3, 2);
assertArrayEquals(new int[] {0, 0, 0, 22, 44, 0}, b);

Также помните, чтоarraycopy выдаст:

  • NullPointerException, если любой из массивовnull

  • IndexOutOfBoundsException, если копия ссылается на любой массив за пределами своего диапазона

  • ArrayStoreException, если копия приводит к несоответствию типов

3.3. Наблюдение за датой и временем

Есть два метода, связанных со временем вSystemс. Один -currentTimeMillis, другой -nanoTime.

currentTimeMillis возвращает количество миллисекунд, прошедших с Unix Epoch, то есть 1 января 1970 г., 12:00 AM UTC:

public long nowPlusOneHour() {
    return System.currentTimeMillis() + 3600 * 1000L;
}

public String nowPrettyPrinted() {
    return new Date(System.currentTimeMillis()).toString();
}

nanoTime возвращает время относительно запуска JVM. Мы можем назвать это несколько раз, чтобы отметить ход времени в приложении:

long startTime = System.nanoTime();
// ...
long endTime = System.nanoTime();

assertTrue(endTime - startTime < 10000);

Обратите внимание, что посколькуnanoTime очень мелкозернистый,it’s safer to do endTime – startTime < 10000 than endTime < startTime due to the possibility of numerical overflow.

3.4. Выход из программы

Если мы хотим программно выйти из выполняемой в данный момент программы,System.exit сделает свое дело.

Чтобы вызватьexit, нам нужно указать код выхода, который будет отправлен в консоль или оболочку, запустившую программу.

По соглашению в Unix состояние 0 означает нормальный выход, а ненулевое означает, что произошла ошибка:

if (error) {
    System.exit(1);
} else {
    System.exit(0);
}

Обратите внимание, что для большинства современных программ было бы странно называть это. When called in a web server application, for example, it may take down the entire site!с

3.5. Доступ к свойствам среды выполнения

System обеспечивает доступ к свойствам времени выполнения с помощьюgetProperty.

И мы можем управлять ими с помощьюsetProperty иclearProperty:

public String getJavaVMVendor() {
    System.getProperty("java.vm.vendor");
}

System.setProperty("abckey", "abcvaluefoo");
assertEquals("abcvaluefoo", System.getProperty("abckey"));

System.clearProperty("abckey");
assertNull(System.getProperty("abckey"));

Свойства, указанные через-D, доступны черезgetProperty.

Мы также можем предоставить значение по умолчанию:

System.clearProperty("dbHost");
String myKey = System.getProperty("dbHost", "db.host.com");
assertEquals("db.host.com", myKey);

АSystem.getProperties предоставляет набор всех системных свойств:

Properties properties = System.getProperties();

Из которого мы можем выполнять любые операцииProperties:

public void clearAllProperties() {
    System.getProperties().clear();
}

3.6. Доступ к переменным среды

System также предоставляет доступ только для чтения к переменным среды с помощьюgetenv.

Например, если мы хотим получить доступ к переменной окруженияPATH, мы можем:

public String getPath() {
    return System.getenv("PATH");
}

3.7. Администрирование сборки мусора

Как правило, сборка мусора непрозрачна для наших программ. Однако иногда нам может потребоваться сделать прямое предложение в JVM.

System.runFinalization - это метод, который позволяет нам предложить JVM запустить процедуру финализации.

System.gc - это метод, который позволяет нам предложить JVM запустить свою процедуру сборки мусора.

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

Однако их можно использовать для оптимизации, скажем, для вызоваgc, когда настольное приложение свернуто:

public void windowStateChanged(WindowEvent event) {
    if ( event == WindowEvent.WINDOW_DEACTIVATED ) {
        System.gc(); // if it ends up running, great!
    }
}

Для получения дополнительной информации о завершении ознакомьтесь с нашимfinalize guide.

4. Заключение

В этой статье мы увидели некоторые поля и методы, которые предоставляетSystem. Полный список можно найти вofficial System documentation.

Также ознакомьтесь со всеми примерами в этой статьеover on Github.