对应《疯狂Java讲义(第5版)》7.1-7.2 章节
Java程序的入口
1
| public static void main(String[] args){...}
|
public : 暴露main方法,保证JVM可以调用
static:JVM直接通过类调用类方法,而不用创建实例
void: 方法没有返回值
args:运行java时后面带的字符串参数
1
| java ArgsTest Java Spring "Java Spring"
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class ArgsTest { public static void main(String[] args) { System.out.println(args.length); for (String arg : args) { System.out.println(arg); } } }
|
Scanner获取输入
Scanner类是一个基于正则表达式的文本扫描器
可以接收输入流(键盘)、文件、字符串等作为数据源并解析数据
可能阻塞等待信息输入。输入源未结束,且Scanner读不到更多输入时,hasNext()和next()都有可能阻塞
扫描输入两种方法
使用 hasNextXxx() 方法进行验证,再使用 nextXxx() 来读取:Int、Long、Float
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class ScannerKeyBoardTest { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()) { System.out.println("键盘输入的内容是:" + sc.next()); } } }
|
sc.useDelimiter(“\n”);可改变Scanner的分隔符,参数为一个正则表达式
若执行nextLong() , 输入不是整数,则程序会直接退出
next() 与 nextLine() 区别
next(): (空格、Tab、回车)
- 1、一定要读取到有效字符后才可以结束输入。
- 2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
- 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
- next() 不能得到带有空格的字符串。
nextLine():
- 1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
- 2、可以获得空白。
读取文件输入
以File对象作为构造器参数,读文件可能引发IO异常
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class ScannerFileTest { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(new File("ScannerFileTest.java")); System.out.println("ScannerFileTest.java文件内容如下:"); while(sc.hasNextLine()) { System.out.println(sc.nextLine()); } } }
|
System类
System类代表当前Java程序运行的平台,System类提供了访问平台环境变量和系统属性的类方法,程序不能创建System类的对象
getenv(),getProperties(),getProperty(“os.name”)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class SystemTest { public static void main(String[] args) throws Exception { Map<String,String> env = System.getenv(); for (String name : env.keySet()) { System.out.println(name + " ---> " + env.get(name)); } System.out.println(System.getenv("JAVA_HOME")); Properties props = System.getProperties(); props.store(new FileOutputStream("props.txt") , "System Properties"); System.out.println(System.getProperty("os.name")); } }
|
currentTimeMills()
, nanoTime()
,返回距离1970年1月1日午夜的时间差
时间粒度取决于底层操作系统
标准输入流、输出流、错误输出流
in、out、err、setIn、setOut、setErr()
identityHashCode(Object X)
返回指定对象精确hashCode值,hashCode值相同必定为同一对象,根据对象地址计算得到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class IdentityHashCodeTest { public static void main(String[] args) { String s1 = new String("Hello"); String s2 = new String("Hello"); System.out.println(s1.hashCode() + "----" + s2.hashCode()); System.out.println(System.identityHashCode(s1) + "----" + System.identityHashCode(s2)); String s3 = "Java"; String s4 = "Java"; System.out.println(System.identityHashCode(s3) + "----" + System.identityHashCode(s4)); } }
|
Runtime类
代表java程序的运行时环境,每个Java程序对应一个Runtime实例,通过getRuntime()获取
gc()和runFinalization()通知系统垃圾回收
可以访问JVM的信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class RuntimeTest { public static void main(String[] args) { Runtime rt = Runtime.getRuntime(); System.out.println("处理器数量:" + rt.availableProcessors()); System.out.println("空闲内存数:" + rt.freeMemory()); System.out.println("总内存数:" + rt.totalMemory()); System.out.println("可用最大内存数:" + rt.maxMemory()); } }
|
exec() 启动进程运行操作系统命令,即产生了一个进程
1 2 3 4 5 6 7 8 9 10
| public class ExecTest { public static void main(String[] args) throws Exception { Runtime rt = Runtime.getRuntime(); rt.exec("notepad.exe"); } }
|
Java9 的 ProcessHandle
Process代表进程,ProcessHandle接口可获取进程信息,ProcessHandle ph = p.toHandle()
,ProcessHandle.Info info = ph.info()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| public class ProcessHandleTest { public static void main(String[] args) throws Exception { Runtime rt = Runtime.getRuntime(); Process p = rt.exec("notepad.exe"); ProcessHandle ph = p.toHandle(); System.out.println("进程是否运行: " + ph.isAlive()); System.out.println("进程ID: " + ph.pid()); System.out.println("父进程: " + ph.parent()); ProcessHandle.Info info = ph.info(); System.out.println("进程命令: " + info.command()); System.out.println("进程参数: " + info.arguments()); System.out.println("进程启动时间: " + info.startInstant()); System.out.println("进程累计运行时间: " + info.totalCpuDuration()); CompletableFuture<ProcessHandle> cf = ph.onExit(); cf.thenRunAsync(()->{ System.out.println("程序退出"); }); Thread.sleep(5000); } }
|