Panduan Pantas ke java.lang.System

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat sekilas kelas java.lang.System dan ciri serta fungsi terasnya.

2. IO

Sistem adalah bahagian dari java.lang , dan salah satu ciri utamanya adalah memberi kita akses ke aliran I / O standard.

Ringkasnya, ia memaparkan tiga bidang, satu untuk setiap aliran:

  • keluar
  • keliru
  • dalam

2.1. Sistem.keluar

System.out menunjuk ke aliran output standard, 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. Sistem.err

System.err sama seperti System.out . Kedua-dua bidang adalah contoh PrintStream, dan kedua-duanya adalah untuk mencetak mesej ke konsol.

Tetapi System.err mewakili ralat standard dan kami menggunakannya khusus untuk mengeluarkan mesej ralat:

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

Konsol selalunya menjadikan aliran ralat berbeza daripada aliran output.

Untuk maklumat lebih lanjut, periksa dokumentasi PrintStream .

2.3. Sistem.in

System.in menunjukkan standard dalam, memperlihatkannya sebagai InputStream, dan kita dapat menggunakannya untuk membaca input dari konsol.

Walaupun agak terlibat, kami masih dapat menguruskan:

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 input dari standard in. Apa pun bait panjang seterusnya akan dibaca dari aliran dan disimpan dalam array bait.

Apa-apa sahaja yang ditaip oleh pengguna tetap dalam aliran , menunggu panggilan lain dibaca.

Sudah tentu, beroperasi pada tahap yang rendah boleh mencabar dan rawan kesalahan, jadi kita dapat membersihkannya sedikit dengan BufferedReader :

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

Dengan susunan di atas, readLine akan membaca dari System.in sehingga pengguna mencapai pulangan, yang sedikit lebih dekat dengan apa yang kita harapkan.

Perhatikan bahawa kami sengaja tidak menutup aliran dalam kes ini. Menutup standard dalam cara yang ia tidak boleh dibaca lagi untuk kitaran hayat program ini!

Dan akhirnya, penggunaan lanjutan System.in adalah memanggil System.setIn untuk mengarahkannya ke InputStream yang berbeza .

3. Kaedah Utiliti

Sistem memberi kami banyak kaedah untuk membantu kami dengan perkara seperti:

  • Mengakses konsol
  • Menyalin tatasusunan
  • Memerhatikan tarikh dan masa
  • Keluar dari JRE
  • Mengakses sifat runtime
  • Mengakses pemboleh ubah persekitaran, dan
  • Mengendalikan pengumpulan sampah

3.1. Mengakses Konsol

Java 1.6 memperkenalkan satu lagi cara untuk berinteraksi dengan konsol daripada hanya menggunakan System.out dan dalam secara langsung.

Kita boleh mengaksesnya dengan memanggil System.console :

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

Perhatikan bahawa bergantung pada sistem operasi yang mendasari dan bagaimana kami melancarkan Java untuk menjalankan program semasa, konsol mungkin kembali kosong, jadi selalu pastikan untuk memeriksa sebelum menggunakannya .

Lihat dokumentasi Konsol untuk lebih banyak kegunaan.

3.2. Menyalin Susunan

System.arraycopy adalah cara gaya C lama untuk menyalin satu susunan ke yang lain.

Selalunya, arraycopy bertujuan untuk menyalin satu array yang lengkap ke dalam array yang 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); 

Walau bagaimanapun, kita dapat menentukan kedudukan permulaan untuk kedua-dua tatasusunan, dan juga berapa banyak elemen yang akan disalin.

Sebagai contoh, katakan kita mahu menyalin 2 elemen dari a , bermula pada [1] hingga b , bermula pada b [3] :

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

Juga, ingat bahawa arraycopy akan membuang:

  • NullPointerException jika mana-mana array adalah nol
  • IndexOutOfBoundsException jika salinan merujuk pada susunan yang berada di luar julatnya
  • ArrayStoreException jika salinan menghasilkan ketidakcocokan jenis

3.3. Memerhatikan Tarikh dan Masa

Terdapat dua kaedah yang berkaitan dengan masa dalam Sistem . Salah satunya adalah currentTimeMillis dan yang lain adalah 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 kaedah yang membolehkan kita menyarankan agar JVM menjalankan rutin pengumpulan sampah.

Oleh kerana kontrak kedua kaedah ini tidak menjamin bahawa penyelesaian atau pengumpulan sampah akan berjalan, kegunaannya adalah sempit.

Namun, mereka dapat digunakan sebagai pengoptimuman, katakan menggunakan gc ketika aplikasi desktop diminimalkan:

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

Untuk maklumat lanjut mengenai penyelesaian, lihat panduan akhir kami.

4. Kesimpulan

Dalam artikel ini, kita dapat melihat beberapa bidang dan kaedah yang disediakan oleh Sistem . Senarai lengkap boleh didapati dalam dokumentasi Sistem rasmi.

Juga, periksa semua contoh dalam artikel ini di Github.