与运行环境交互:
运行Java程序的参数:
Main方法为什么采用这样的方法签名:
1. public修饰符:Java类由JVM调用,为了让JVM可以自由调用这个Main方法所以使用public修饰符把这个方法暴露出来。
2. Static修饰符:JVM调用这个主方法时,不可能创建该主类的对象,然后通过对象来调用这个主方法,,JVM直接通过主类来调用主方法,因此使用static修饰主方法。
3. Void返回值:因为主方法被JVM调用,该方法的返回值将返回给JVM,这没有任何意义,因此Main方法没有任何意义。
JVM将args数组设置成一个长度为0的数组。
可以运行命令Java 主类 第一个参数 第二个参数 第三个参数。。。(用空格隔开)
如果某参数本身包含了空格,则应该将该参数用双引号括起来,否则JVM会把这个空格当成参数分隔符,而不是当成参数本身。
使用Scanner获取键盘的输入
Scanner是一个基于正则表达式的文本扫描器,他可以从文件,输入流,字符串中解析
出基本类型值和字符串值。Scanner提供了多个构造器,不同的构造器可以接受文件,输入流,字符串作为数据源,用于从文件,输入流,字符串中解析数据。
Scanner主要提供两个方法来扫描输入:
1. hasNextXXX():是否还有下一个输入项,其中XXX可以是int,Long等基本数据类型的字符串。如果需要判断是否包含下一个字符串,可以省略XXX
2. NextXXX():获取下一个输入项。XXX的含义与前一个方法中XXX相同。
默认情况下:Scanner使用空白(包括空格,Tab空白,回车)作为多个输入项之间的分隔符
Sanner的读取操作可能被堵塞(当前执行顺序流暂停)来等待信息的输入。如果输入源没有结束,Scanner又读不到更多的输入项时(尤其是键盘输入时比较常见),Scanner的hasNext和next方法都有可能阻塞,hasNext和next方法是否阻塞无关。
Scanner提供了两个简单的方法来逐行读取:
1. Boolean hasNextLine():返回输入源中是否还有下一行
2. String nextLine():返回输入源中下一行字符串。
Scanner不仅可以获取字符串输入项,也可以获取任何基本类型的输入项。
Scanner不仅读取用户键盘输入,Scanner还可以读取文件输入。只要在创建Scanner对象时,传入一个Flies对象作为参数,就可以让Scanner读取文件中的内容。
使用BufferedReader获取键盘的输入:
BufferedReader是Java IO流中的一个字符,包装流,它必须建立在另一个字符流的基础之上,但是标准输入:System.in是字节流,程序需要使用转换流InputStreamReader将其包装成字符流。所以程序中用于获取键盘输入的BufferedReader对象采用如下构建:BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
一旦获得了BufferedReader对象之后,就可以调用该对象的readLine()方法来逐行读取键盘输入:如果没有键盘输入,readLine方法会将阻塞来等待键盘输入。
BufferedReader不能读取基本类型输入项,他总是读取String对象。
系统相关:
Java提供了System类和Runtime类来与程序运行的平台进行交互。
System类:
System类代表当前Java程序的运行平台,程序不能创建System类的对象,所以它提供了一些类属性和类方法,允许直接通过System类名类调用这些属性和方法。
System提供了代表标准输入,标准输出和错误输出的类属性;并提供了一些静态方法用于访问环境变量,系统属性的方法,还提供了加载文件和动态链接库的方法。
加载文件和动态链接库主要对native方法有用,对于一些特殊的功能(如访问操作系统底层硬件设备等),Java程序无法实现,其实现步骤如下:
1. 在Java程序中声明native()方法,类似于abstract方法,只有方法签名,没有实现。编译该Java程序生成一个class文件。
2. 用javah编译第一步生成的class文件,将产生一个.h文件
3. 写一个.cpp文件实现native方法,其中需要包含第二步产生的.h文件(.h文件中又包含了JDK带的jni.h文件)
4. 将第三步的.cpp文件编译成动态连接库文件。
5. 在Java中用System的LoadLibrary()方法或Runtime的LoadLibrary()方法加载第四步产生的动态链接库文件,Java程序中就可以调用这个native()方法了。
环境变量和系统变量
System类还有两个获取系统当前时间的方法:currentTimeMillis()和nanoTime(),他们都返回一个long型的整数,实际上时返回当前时间于UTC1970年1月1日午夜的时间差,前者以毫秒做测量单位,后者以微秒作为测量单位,这两个方法的返回值的粒度取决于底层操作系统,可能所在操作系统根本不支持以微秒,毫秒作为计时单位
除此之外,System的in,out和err分别代表了系统的标准输入(通常是键盘),标准输出(通常是显示器)和错误输出流,并提供了setIn,setOut和setErr方法来改变系统的标准输入,标准输出和标准错误输出流。
System还提供了一个identityHashCode(Object x)方法,该方法返回指定对象的精确hashCode值,也就是根据该对象的地址计算得到的hashCode值。如果两个对象的 identityHashCode相同,则两个对象绝对是同一个对象。因为identityHashCode值是根据对象的地址值计算得到的,所以任何两个对象的identityHashCode值总是不相等。
Runtime类:
Runtime类代表Java程序的运行时环境,应用程序通过该对象与其运行环境相连。
应用程序不能创建自己的Runtime实例,但可以通过getRuntime()方法获取与之关联的Runtime对象。提供了load(String filename)和loadLibrary(String libname)方法来加载文件和动态链接库。Runtime类代表JAVA程序的运行时环境,可以访问JVM的相关信息。
他可以直接单独启动一条进程来运行操作系统的命令。
java基础知识整理15
最新推荐文章于 2022-04-19 11:54:45 发布