ภาษาจาวาจัดเตรียม อินพุตพื้นฐาน เอาต์พุตพื้นฐาน และเอาต์พุตข้อผิดพลาดพื้นฐานให้เราใช้งาน คือ System.in System.out และ System.err โดยทั้งหมดนี้อยู่ในคลาส System โดย in, out และ err คือ ฟิลด์ในคลาส System
ฟิลด์ err และฟิลด์ out เป็นฟิลด์ที่มีชนิดของข้อมูลเป็นคลาส PrintStream ซึ่งค่าตั้งต้นจะเป็นการเขียนข้อมูลไปยังหน้าต่างคอนโซล ส่วนฟิลด์ in เป็นฟิลด์ที่มีชนิดของข้อมูลเป็นคลาส InputStream ซึ่งค่าตั้งต้นจะเป็นการรับข้อมูลจากคีย์บอร์ด การรับ/ส่งข้อมูลดังกล่าวจะเป็นการใช้งานในโหมดบรรทัดคำสั่ง เช่น ในหน้าต่างคอนโซล ตัวอย่างการใช้งานที่คุ้นเคยเช่น System.out.printLn() เพื่อพิมพ์ไปยังหน้าต่างคอนโซล หรือ Scanner scanner = new Scanner(System.in) เพื่อบอกออบเจกต์ scanner ให้อ่านข้อมูลจาก System.in ซึ่งก็คือสตรีมข้อมูลที่มาจากคีย์บอร์ด
เราสามารถเปลี่ยนไปใช้การรับ/ส่งข้อมูลแบบอื่นได้ เช่น การอ่านหรือเขียนข้อมูลกับไฟล์ ตัวอย่างเช่น กำหนดชื่อไฟล์ให้กับออบเจกต์ File แล้วนำออบเจกต์ไปใช้กับออบเจตก์ Scanner อีกทีหนึ่ง (เราไม่สามารถกำหนดชื่อไฟล์ให้กับ Scanner ได้ตรงๆเพราะออบเจกต์ Scanner จะมองเป็นข้อความชื่อไฟล์ แต่ออบเจกต์ File จะบอกออบเจกต์ Scanner ว่านี่คือไฟล์)
File file = new File(filename); Scanner scanner = new Scanner(file);
สำหรับเปลี่ยนให้ System.out ไปเขียนลงไฟล์ทำได้โดยสร้างออบเจตก์ PrintStream ขึ้นมาโดยกำหนดให้เอาต์พุทสตรีมเป็นออบเจกต์ File จากนั้นเปลี่ยนทิศทางของเอาต์พุทสตรีมมาตรฐานจากคอนโซลไปเป็นส่งผ่านออบเจกต์ PrinStream แทนด้วยเมธอด System.setOut() จากนั้นจึงสั่งพิมพ์ตามปรกติด้วยเมธอด System.out.printLn()
PrintStream o = new PrintStream(new File(filename)); System.setOut(o); System.out.print(sourceStr);
System.in, System.out และ System.err จะถูกเตรียมให้พร้อมใช้งานโดย Java Runtime เมื่อ Java VM เริ่มทำงาน ดังนั้นเราจึงไม่ต้องสร้างออบเจตก์ของสตรีมทั้ง 3 แบบด้วยตนเอง ตัวอย่างการใช้งานที่เราคุ้นเคย เช่น System.out.println() หรือ new Scanner(System.in) เป็นต้น
นอกจาก อินพุตพื้นฐาน เอาต์พุตพื้นฐาน และเอาต์พุตข้อผิดพลาดพื้นฐาน ที่ภาษาจาวาเตรียมให่ในคลาส System แล้ว ตัวคลาส System ยังเมธอดที่มีประโยชน์มากมาย เช่น การเข้าถึงคุณสมบัติที่กำหนดไว้ภายนอก การเข้าถึงตัวแปรสภาพแวดล้อม วิธีการโหลดไฟล์และไลบรารี และเครื่องมือสำหรับการคัดลอกอาร์เรย์ โดยเมธอดเหล่านี้เราสามารถเรียกใช้ได้เลยโดยไม่ต้องสร้างออบเจกต์เนื่องจากเป็นเมธอดแบบ static ทั้งหมด
เนื่องจากฟิลด์ out และ err เป็นฟิลด์ที่มีชนิดของข้อมูลเป็นคลาส PrintStream ดังนั้นเราสามารถใช้เมธอดต่างๆของคลาส PrintStream ได้ และฟิลด์ in สามารถใช้เมธอดต่างๆของคลาส InputStream ได้เช่นเดียวกัน ตัวอย่างเช่น
System.out.printLn() พิมพ์แล้วขึ้นบรรทัดใหม่
System.out.print() พิมพ์โดยไม่ขึ้นบรรทัดใหม่
System.out.printf() สามารถกำหนดรูปแบบของข้อความที่จะพิมพ์ได้
System.out.append() เอาข้อความไปต่อในเอาท์พุตสตรีม
System.out.flush() ส่งออกข้อความทั้งหมดในเอาท์พุตสตรีม
สำหรับตัวเมธอดในคลาส System นั้นมีอยู่หลายเมธอด บางเมธอดก็มีความเสี่ยงในการใช้งาน ในที่นี้จะกล่าวถึงเพียงบางเมธอดเท่านั้น สำหรับรายละเอียดทั้งหมดสามารถดูได้จาก https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/System.html
1. static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) ใช้สำเนาข้อมูลจากอาเรย์หนึ่งไปยังอีกอาเรย์หนึ่ง เมธอดนี้ไม่มีการส่งผลลัพธ์ใดๆกลับออกมา จากตัวอย่างด้านล่างเป็นการสำเนาข้อมูลจากอาเรย์ str1 ไปยังอาเรย์ str2 ที่สร้างเป็นอาเรย์เปล่าขึ้นมารอไว้ โดยเราสามารถระบุดัชนีตั้งต้นของอาเรย์ต้นท างที่ต้องการสำเนา และดัชนีตั้งต้นของอาเรย์ปลายทางที่ต้องการเอาไปวางได้ด้วย
package com.company;
import java.util.Arrays;
public class Main {
public static void main(String[] args){
String[] str1 = new String[] {"one", "two", "three"};
String[] str2 = new String[3];
System.arraycopy(str1,0,str2,0,3);
System.out.println(Arrays.toString(str2));
}
}
[one, two, three]
2. static long currentTimeMillis() แสดงเวลาปัจจุบันในรูปแบบมิลลิวินาที โดยคืนค่ากลับเป็นข้อมูลชนิด long
package com.company;
public class Main {
public static void main(String[] args){
System.out.println(System.currentTimeMillis());
}
}
1626322469233
3. static Map<String, String> getenv() และ static String getenv(String name) แสดงข้อมูลของตัวแปรสภาพแวดล้อม โดย getenv() จะแสดงทั้งหมดโดยคืนค่าเป็น Map collection หรือ เลือกดูค่าเฉพาะของบางตัวแปรโดยใช้ getenv(String name) ซึ่งจะคืนค่าเป็นชนิดข้อมูลแบบ String
package com.company;
import java.util.Map;
public class Main {
public static void main(String[] args){
Map<String,String> map = System.getenv();
map.forEach((key, value) -> System.out.println("Key is "+ key + " Value is " + value));
String value = System.getenv("PATH");
System.out.println("Value is "+value);
}
}
Key is PATH Value is /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Key is INVOCATION_ID Value is bc0d862214244f528d12df29b2938463
Key is XAUTHORITY Value is /run/user/1000/gdm/Xauthority
.
.
.
Value is /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
4. static Properties getProperties() และ static String getProperty(String key) และ static String getProperty(String key, String def) แสดงค่าที่เป็นข้อมูลของ jvm ที่ทำงานอยู่ โดยใช้ getProperties เพื่อแสดงทั้งหมดซึ่งจะคีนค่าเป็นชนิดขงอข้อมูลแบบ Properties ซึ่งหากต้องการพิมพ์ออกมาต้องแปลงเป็น String เสียก่อน ส่วน getProperty เป็นการแสดงค่าของคีย์ที่ต้องการเป็นข้อความ โดยเราสามารถกำหนดได้ว่า ถ้าไม่พบคีย์หรือคีย์ไม่ได้มีการกำหนดค่าไว้ ให้คืนค่าเป็นค่าที่กำหนดไว้
package com.company;
public class Main {
public static void main(String[] args){
String properties = System.getProperties().toString();
String[] arrProp = properties.split(" ");
for (String str : arrProp) { System.out.println(str);}
System.out.println();
System.out.println("Property of sun.desktop is "+System.getProperty("sun.desktop"));
}
}
{sun.desktop=gnome,
awt.toolkit=sun.awt.X11.XToolkit,
java.specification.version=11,
.
.
.
sun.io.unicode.encoding=UnicodeLittle,
java.class.version=55.0}
Property of sun.desktop is gnome