System类
java.lang.System类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作。 它不能被实例化。
- 在 System 类提供的设施中,有标准输入、标准输出和错误输出流;对外部定义的属性和环境变量的访问;加载文件和库的方法;还有快速复制数组的一部分的实用方法。
System类的成员变量:
-
public static final InputStream in;
“标准”输入流。 此流已打开并准备好提供输入数据。该流通常对应于**键盘输入**或由主机环境或用户指定的另一输入源。
// main方法的args接收参数。用于控制台运行java程序。 // 1、先将HelloWorld.java文件编译为class文件 : javac HelloWorld.java // 2、通过java命令运行class文件 //HelloWorld表示HelloWorld的class文件,后面的hello和world代表传递的参数,之间使用空格隔开的 java HelloWorld hello world
例子:
public class HelloWorld{ public static void main(String[] args){ if(args.length == 0){ System.out.println("此main方法没有传递参数!"); return; } System.out.println("此main方法传递de参数!"); for(String arg : args){ System.out.print(arg+"\t"); } } }
//在jdk1.5之后java引入了Scanner类便于用户输入 Scanner sc = new Scanner(System.in); 在读取前一般需要使用 hasNext()与 hasNextLine()判断是否还有输入的数据: String str = sc.next(); next(): //1、一定要读取到有效字符后才可以结束输入。 //2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。 //3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。 //4、next() 不能得到带有空格的字符串。 str = sc.nextLine(); nextLine(): //1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。 //2、可以获得空白。 如果要输入 int 或 float 等类型的数据,在Scanner类中也有支持,但是在输入之前最好先使用 hasNextXxx()方法进行验证 int i1 = sc.nextInt(); // 接收输入整数 float f1 = sc.nextFloat(); // 接收输入的浮点数 double d1 = sc.nextDouble(); // 接收输入的双精度浮点数 long l1 = sc.nextLong(); Byte b1 = sc.nextByte(); Short s1 = sc.nextShort(); booleam bool1 = sc.nextBoolean(); BigInteger big1 = sc.nextBigInteger();
-
public static final PrintStream out;
“标准”输出流。 此流已打开并准备接受输出数据。 通常,该流对应于主机环境或用户指定的显示输出或另一输出目的地。
对于简单的独立Java应用程序,编写一行输出数据的典型方法是:
System.out.println(data)
-
public static final PrintStream err;
“标准”错误输出流。 此流已打开并准备接受输出数据。 通常,该流对应于主机环境或用户指定的显示输出或另一输出目的地。
按照惯例,此输出流用于显示应立即引起用户注意的错误消息或其他信息。
成员方法:
-
public static void gc()
:运行垃圾回收器。 -
public static void exit(int status)
:终止当前正在运行的java虚拟机,参数用作状态码;根据惯例,非 0 的状态码表示异常终止。public static void main(String[] args){ System.out.println("我正在学java"); System.exit(0); System.out.println("我正在学java"); System.out.println("我正在学java"); System.out.println("我正在学java"); } // 正常情况会打印四句"我正在学java",但是遇到System.exit(0);将会终止当前运行的虚拟机(java程序是运行在jvm上的),所以java程序也会终止运行。
-
static long currentTimeMills()
:基于系统时间返回当前时间的毫秒数,从1970年1月1日0:0:0到当前时间。// 打印输出10000个helloworld需要花费的毫秒数 public static void main(String[] args){ //获取当前时间的毫秒值 long start = System.currentTimeMillis(); for(int i = 0 ; i < 10000 ; i++){ System.out.println("第"+i+"个hello world"); } // 获取打印完成后的毫秒数 long end = System.currentTimeMillis(); //输出结果自己测试 System.out.println("这段程序共用了"+(end - start)+"毫秒"); }
补充:
public static long nanoTime()
: 返回正在运行的Java虚拟机的高分辨率时间源的当前值,以纳秒为单位。 仅当计算在Java虚拟机的同一实例中获得的两个此类值之间的差异时,此方法返回的值才有意义。区别:
- System.nanoTime()的精确度更高一些,如今的硬件设备性能越来越好,如果要更精密计算执行某行代码或者某块代码所消耗的时间,该方法会测量得更精确。
- 记录当前时间,用System.currentTimeMills()单独获取System.nanoTime()没有什么意义,因为该值是随机的,无法表示当前的时间。
- System.currentTimeMills()得到的值是基于系统时间的,值可以人为地进行修改。能够和Date类方便地转换。
- 如果需要根据时间差来过滤某些频繁的操作,用System.nanoTime()会比较合适。
-
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
:将指定源数组中的数组从指定位置开始复制到目标数组的指定位置。 从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。参数说明: src - 源数组。 srcPos - 源数组中的起始位置。 dest - 目标数组。 destPos - 目标数据中的起始位置。 length - 要复制的数组元素的数量。 异常 IndexOutOfBoundsException - 如果复制会导致访问数组边界外的数据。 ArrayStoreException - 如果由于类型不匹配, src阵列中的元素无法存储到 dest阵列中。 NullPointerException - 如果 src或 dest是 null。
public static void main(String[] args){ int[] arr = {11 , 12 , 13 , 14 , 15}; int[] arr2 = {1, 2 , 3 , 4 , 5}; System.arraycopy(arr, 1, arr2, 2, 2); System.out.println(Arrays.toString(arr)); System.out.println(Arrays.toString(arr2)); //输出结果为: //[11 , 12 , 13 , 14 , 15] //[1 , 2 , 12 , 13 , 5] }
如果 src或 dest是 null。
```java
public static void main(String[] args){
int[] arr = {11 , 12 , 13 , 14 , 15};
int[] arr2 = {1, 2 , 3 , 4 , 5};
System.arraycopy(arr, 1, arr2, 2, 2);
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(arr2));
//输出结果为:
//[11 , 12 , 13 , 14 , 15]
//[1 , 2 , 12 , 13 , 5]
}