Java基础类库-1

AI摘要:

对应《疯狂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)
{
// 输出args数组的长度
System.out.println(args.length);
// 遍历args数组的每个元素, 输出3个值:"Java" "Spring" "Java Spring"
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)
{
// System.in代表标准输入,就是键盘输入
Scanner sc = new Scanner(System.in);
// 增加下面一行将只把回车作为分隔符
// sc.useDelimiter("\n");
// 判断是否还有下一个输入项
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
{
// 将一个File对象作为Scanner的构造器参数,Scanner读取文件内容
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.txt文件中
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)
{
// 下面程序中s1和s2是两个不同对象
String s1 = new String("Hello");
String s2 = new String("Hello");
// String重写了hashCode()方法——改为根据字符序列计算hashCode值,
// 因为s1和s2的字符序列相同,所以它们的hashCode方法返回值相同
System.out.println(s1.hashCode()
+ "----" + s2.hashCode());
// s1和s2是不同的字符串对象,所以它们的identityHashCode值不同
System.out.println(System.identityHashCode(s1)
+ "----" + System.identityHashCode(s2));
String s3 = "Java";
String s4 = "Java";
// s3和s4是相同的字符串对象,所以它们的identityHashCode值相同
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)
{
// 获取Java程序关联的运行时对象
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信息
ProcessHandle.Info info = ph.info();
// 通过ProcessHandle.Info信息获取进程相关信息
System.out.println("进程命令: " + info.command());
System.out.println("进程参数: " + info.arguments());
System.out.println("进程启动时间: " + info.startInstant());
System.out.println("进程累计运行时间: " + info.totalCpuDuration());
// 通过CompletableFuture在进程结束时运行某个任务
CompletableFuture<ProcessHandle> cf = ph.onExit();
cf.thenRunAsync(()->{
System.out.println("程序退出");
});
Thread.sleep(5000);
}
}

Java基础类库-1
https://blog.cngo.rr.nu/posts/cea.html
作者
cngo
发布于
2024年7月10日
许可协议