Кратко ръководство за java.lang.System

1. Общ преглед

В този урок ще разгледаме набързо класа java.lang.System и неговите характеристики и основна функционалност.

2. IO

Системата е част от java.lang и една от основните й характеристики е да ни даде достъп до стандартните I / O потоци.

Най-просто казано, тя излага три полета, по едно за всеки поток:

  • навън
  • грешка
  • в

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 сочи към стандарта в, излагайки го като 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 , приложението спира и изчаква въвеждане от стандартния инч . Каквато и да е следващата дължина на байтовете, ще бъде прочетена от потока и съхранена в байтовия масив.

Всичко друго, въведено от потребителя, остава в потока в очакване на друго повикване за четене.

Разбира се, работата на това ниско ниво може да бъде предизвикателна и склонна към грешки, така че можем да я почистим малко с BufferedReader :

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

С горната подредба readLine ще чете от System.in, докато потребителят натисне връщане, което е малко по-близо до това, което можем да очакваме.

Обърнете внимание, че умишлено не затваряме потока в този случай. Затварянето на стандарта в означава, че той не може да бъде прочетен отново за жизнения цикъл на програмата!

И накрая, усъвършенстваното използване на System.in е да извика System.setIn, за да го пренасочи към различен InputStream .

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

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

  • Достъп до конзолата
  • Копиране на масиви
  • Спазване на дата и час
  • Излизане от JRE
  • Достъп до свойства по време на изпълнение
  • Достъп до променливи на средата и
  • Администриране на събирането на боклука

3.1. Accessing the Console

Java 1.6 introduced another way of interacting with the console than simply using System.out and in directly.

We can access it by calling System.console:

public String readUsername() { Console console = System.console(); return console == null ? null : console.readLine("%s", "Enter your name: "); }

Note that depending upon the underlying operating system and how we launch Java to run the current program, console might return null, so always make sure to check before using.

Check out the Console documentation for more uses.

3.2. Copying Arrays

System.arraycopy is an old C-style way of copying one array into another.

Mostly, arraycopy is intended to copy one complete array into another array:

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); 

However, we can specify the starting position for both arrays, as well as how many elements to copy.

For example, let's say we want to copy 2 elements from a, starting at a[1] to b, starting at b[3]:

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

Also, remember that arraycopy will throw:

  • NullPointerException if either array is null
  • IndexOutOfBoundsException if the copy references either array beyond its range
  • ArrayStoreException if the copy results in a type mismatch

3.3. Observing Date and Time

There're two methods related to time in System. One is currentTimeMillis and the other is nanoTime.

currentTimeMillis returns the number of milliseconds passed since the Unix Epoch, which is January 1, 1970 12:00 AM UTC:

public long nowPlusOneHour() { return System.currentTimeMillis() + 3600 * 1000L; } public String nowPrettyPrinted() { return new Date(System.currentTimeMillis()).toString(); } 

nanoTime returns the time relative to JVM startup. We can call it multiple times to mark the passage of time in the application:

long startTime = System.nanoTime(); // ... long endTime = System.nanoTime(); assertTrue(endTime - startTime < 10000); 

Note that since nanoTime is so fine-grained, it's safer to do endTime – startTime < 10000 than endTime < startTime due to the possibility of numerical overflow.

3.4. Exiting the Program

If we want to programmatically exit the currently executed program, System.exit will do the trick.

To invoke exit, we need to specify an exit code, which will get sent to the console or shell that launched the program.

By convention in Unix, a status of 0 means a normal exit, while non-zero means some error occurred:

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

Note that for most programs nowadays, it'd be strange to need to call this. When called in a web server application, for example, it may take down the entire site!

3.5. Accessing Runtime Properties

System provides access to runtime properties with getProperty.

And we can manage them with setProperty and 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"));

Properties specified via -D are accessible via getProperty.

We can also provide a default:

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

And System.getProperties provides a collection of all system properties:

Properties properties = System.getProperties();

From which we can do any Properties operations:

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

3.6. Accessing Environment Variables

System also provides read-only access to environment variables with getenv.

If we want to access the PATH environment variable, for example, we can do:

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

3.7. Administering Garbage Collection

Typically, garbage collection efforts are opaque to our programs. On occasion, though, we may want to make a direct suggestion to the JVM.

System.runFinalization is a method that allows us to suggest that the JVM run its finalize routine.

System.gc е метод, който ни позволява да предположим, че JVM изпълнява своята рутина за събиране на боклук.

Тъй като договорите на тези два метода не гарантират, че финализирането или събирането на боклука ще стартират, полезността им е тясна.

Те обаче биха могли да се упражняват като оптимизация, да речем извикване на gc, когато настолното приложение бъде сведено до минимум:

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

За повече информация относно финализирането вижте нашето ръководство за финализиране.

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

В тази статия трябва да видим някои от полетата и методите, които системата предоставя. Пълният списък може да бъде намерен в официалната документация на системата.

Също така вижте всички примери в тази статия в Github.