Panduan Cepat java.lang.System

1. Ikhtisar

Dalam tutorial ini, kita akan melihat sekilas kelas java.lang.System dan fitur serta fungsionalitas intinya.

2. IO

Sistem adalah bagian dari java.lang , dan salah satu fitur utamanya adalah memberi kita akses ke aliran I / O standar.

Sederhananya, ini memperlihatkan tiga bidang, satu untuk setiap aliran:

  • di luar
  • berbuat salah
  • di

2.1. System.out

System.out menunjuk ke aliran keluaran standar, memperlihatkannya sebagai PrintStream , dan kita dapat menggunakannya untuk mencetak teks ke konsol:

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

Penggunaan lanjutan Sistem adalah memanggil System.setOut , yang dapat kita gunakan untuk menyesuaikan lokasi yang akan ditulis oleh System.out :

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

2.2. System.err

System.err sangat mirip dengan System.out . Kedua bidang adalah contoh PrintStream, dan keduanya untuk mencetak pesan ke konsol.

Tetapi System.err mewakili kesalahan standar dan kami menggunakannya secara khusus untuk mengeluarkan pesan kesalahan:

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

Konsol akan sering membuat aliran kesalahan berbeda dari aliran keluaran.

Untuk informasi lebih lanjut, periksa dokumentasi PrintStream .

2.3. System.in

System.in menunjuk ke standar dalam, memperlihatkannya sebagai InputStream, dan kita dapat menggunakannya untuk membaca masukan dari konsol.

Dan meskipun sedikit lebih terlibat, kami masih dapat mengelola:

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

Dengan memanggil System.in.read , aplikasi berhenti dan menunggu masukan dari standar masuk Berapapun panjang byte berikutnya akan dibaca dari aliran dan disimpan dalam array byte.

Apa pun yang diketik oleh pengguna tetap di aliran , menunggu panggilan lain untuk dibaca.

Tentu saja, beroperasi pada level yang rendah dapat menjadi tantangan dan rawan kesalahan, jadi kita dapat sedikit membersihkannya dengan BufferedReader :

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

Dengan pengaturan di atas, readLine akan membaca dari System.in hingga pengguna menekan kembali, yang sedikit lebih dekat dengan apa yang kita harapkan.

Perhatikan bahwa kami sengaja tidak menutup aliran dalam kasus ini. Menutup standar di berarti bahwa hal itu tidak dapat dibaca lagi untuk siklus hidup program!

Dan akhirnya, penggunaan lanjutan System.in adalah memanggil System.setIn untuk mengalihkannya ke InputStream yang berbeda .

3. Metode Utilitas

Sistem memberi kita banyak metode untuk membantu kita dengan hal-hal seperti:

  • Mengakses konsol
  • Menyalin array
  • Mengamati tanggal dan waktu
  • Keluar dari JRE
  • Mengakses properti runtime
  • Mengakses variabel lingkungan, dan
  • Mengelola pengumpulan sampah

3.1. Mengakses Konsol

Java 1.6 memperkenalkan cara lain untuk berinteraksi dengan konsol daripada hanya menggunakan System.out dan di langsung.

Kita dapat mengaksesnya dengan memanggil System.console :

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

Perhatikan bahwa bergantung pada sistem operasi yang mendasarinya dan cara kami meluncurkan Java untuk menjalankan program saat ini, konsol mungkin mengembalikan null, jadi selalu pastikan untuk memeriksa sebelum menggunakan .

Lihat dokumentasi Konsol untuk penggunaan lebih lanjut.

3.2. Menyalin Array

System.arraycopy adalah cara gaya-C lama untuk menyalin satu array ke array lain.

Kebanyakan, arraycopy dimaksudkan untuk menyalin satu array lengkap ke array lain:

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 adalah metode yang memungkinkan kami menyarankan agar JVM menjalankan rutinitas pengumpulan sampahnya.

Karena kontrak kedua metode ini tidak menjamin penyelesaian atau pengumpulan sampah akan berjalan, kegunaannya sempit.

Namun, mereka dapat digunakan sebagai pengoptimalan, katakanlah memanggil gc ketika aplikasi desktop diminimalkan:

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

Untuk mengetahui lebih lanjut tentang finalisasi, lihat panduan penyelesaian kami.

4. Kesimpulan

Pada artikel ini, kita harus melihat beberapa bidang dan metode yang disediakan Sistem . Daftar lengkapnya dapat ditemukan di dokumentasi Sistem resmi.

Juga, lihat semua contoh dalam artikel ini di Github.